Как связаться с Winsock при кросс-компиляции приложения Windows в Linux? - PullRequest
0 голосов
/ 30 августа 2018

Я портирую проект Cmake с Linux на Windows. Он использует сокеты, поэтому использует pthread в Linux и нуждается в Winsock в Windows.

Проект компилируется в Linux с использованием кросс-компиляции для создания бинарных файлов Windows.

Проект уже хорошо компилируется, и при сборке для Linux имеется переключатель для связи pthreads и winsock для Windows.

Однако существует проблема с подключением сокетов, похоже, что 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 Ответ

0 голосов
/ 14 сентября 2018

Через некоторое время, тестируя различные конфигурации, я наконец-то узнал, как решить проблему:

  1. Получите ws2_32.lib непосредственно из установки Windows. Нет необходимости устанавливать 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 в той же папке, что и исполняемый файл. Я не нашел его в моей ОС, поэтому я скачал его.
...