gpt4 book ai didi

c++ - 在 Linux 上交叉编译 Windows 应用程序时如何链接到 Winsock?

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:54 35 4
gpt4 key购买 nike

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

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

该项目已经可以正常编译,并且在为 Linux 构建和为 Windows 构建 winsock 时有一个链接 pthreads 的开关。

但是,sockets 的链接有问题,似乎找不到 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++)

最佳答案

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

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

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

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

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

  1. 静态链接 C 运行时环境:

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

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

关于c++ - 在 Linux 上交叉编译 Windows 应用程序时如何链接到 Winsock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52087180/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com