在 Linux 上交叉编译 Windows 应用程序时如何 link 到 Winsock?

How to link to Winsock when cross-compiling a Windows app on Linux?

我正在将 Cmake 项目从 Linux 移植到 Windows。它使用套接字,因此在 Linux 中使用 pthread,在 Windows 中需要 Winsock。

项目正在 Linux 中编译,使用交叉编译创建 Windows 个二进制文件。

该项目已经可以正常编译,并且在为 Linux 构建和为 Windows 构建 winsock 时切换到 link pthreads。

但是,套接字存在 linking 问题,似乎找不到 winsock。

这是我正在使用的 Cmake 文件的一部分:

find_library(lib1 wsock32)
find_library(lib2 ws2_32)

message("${lib1}  ${lib2}")

if (WIN32)
    target_link_libraries (TaskTool wsock32 ws2_32)
endif(WIN32)

这是我得到的输出:

lib1-NOTFOUND  lib2-NOTFOUND
-- Configuring done
-- Generating done
-- Build files have been written to: 
Linking CXX executable TaskTool.exe
ToolsLib/libToolsLib.a(networkwaker.cpp.obj):networkwaker.cpp:(.text+0x522): referência indefinida a `_imp__socket@12'
ToolsLib/libToolsLib.a(networkwaker.cpp.obj):networkwaker.cpp:(.text+0x559): referência indefinida a `_imp__setsockopt@20'
ToolsLib/libToolsLib.a(networkwaker.cpp.obj):networkwaker.cpp:(.text+0x596): referência indefinida a `_imp__bind@12'
ToolsLib/libToolsLib.a(networkwaker.cpp.obj):networkwaker.cpp:(.text+0x5b0): referência indefinida a `_imp__inet_addr@4'
ToolsLib/libToolsLib.a(networkwaker.cpp.obj):networkwaker.cpp:(.text+0x5c3): referência indefinida a `_imp__htons@4'
ToolsLib/libToolsLib.a(networkwaker.cpp.obj):networkwaker.cpp:(.text+0x614): referência indefinida a `_imp__sendto@24'

winsock add/link 的正确方法是什么?我知道 winsock 在 Linux 中并不可用,因为它是一个 Windows 库。

这是我正在使用的工具链文件:

SET(CMAKE_SYSTEM_NAME Windows)
SET(CMAKE_C_COMPILER   /usr/bin/i686-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/i686-w64-mingw32-g++)

在测试各种配置后,我终于找到了解决问题的方法:

  1. 直接从Windows安装中获取ws2_32.lib。无需安装 Windows SDK。
  2. Link 使用路径名:

    target_link_libraries (TaskTool ToolsLib "${TOOLS_ROOT}/ToolsLib/lib/ws2_32.lib")

  3. 直接在依赖项中包含需要它的模块。没有交叉编译是不必要的,但现在是。

通过这 3 个步骤,程序构建良好。但是,Windows 上没有 运行。为此,需要进行其他更改:

  1. Link静态C 运行时间环境:

target_link_libraries (TaskTool "-static-libgcc" "-static-libstdc++")

  1. 在与可执行文件相同的文件夹中提供 libwinpthread-1.dll。我没有在我的 OS 上找到它,所以我下载了它。