【发布时间】:2018-08-29 23:01:49
【问题描述】:
我正在将一个 Cmake 项目从 Linux 移植到 Windows。它使用套接字,所以在 Linux 中使用 pthread,在 Windows 中需要 Winsock。
项目正在 Linux 中编译,使用交叉编译来创建 Windows 二进制文件。
项目已经编译正常,在为 Linux 构建和为 Windows 构建 winsock 时,有一个链接 pthreads 的开关。
但是,socket 有一个链接问题,似乎没有找到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的正确方法是什么?我知道 Winsock 在 Linux 中并不容易使用,因为它是一个 Windows 库。
有没有我可以安装的标准包? (比如 apt-get install windowssdk...)。
我应该手动复制它并从 Windows 安装链接它吗?
我需要在 Cmake 工具链文件中添加什么内容吗?
这是我正在使用的工具链文件:
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++)
【问题讨论】:
-
看看那些未定义的符号名称,它们看起来非常像您在
ws2_32.lib中找到的那些函数的入口点。我 不是 mingw 专家,所以我不知道这是否真的有效,但请尝试在您的 Windows 系统上安装 Visual Studio Community。除其他外,这将在C:\Program Files (x86)\Windows Kits下的某处安装完整的Windows SDK。在那里寻找ws2_32.lib,然后尽一切努力使该文件包含在您的链接中。 -
从旧的CmakeMingw entry on the CMake wiki 中找到a link to this,这是我使用 Google 找到的。第一个链接提供了一个示例工具链文件,该文件似乎与您需要的非常接近,因为您使用的是使用系统包管理器获得的交叉编译工具链(即
ls /usr/i686-w64-mingw32/lib/libwsock32.a不'不会产生错误,假设我的猜测是正确的)。
标签: c++ linux cmake cross-compiling winsock