我正在将我在linux上写的一个应用程序移植到Windows上。我正在尝试在linux上为windows进行交叉编译。移植应用程序的一部分包括使用winsock库。为了进行交叉编译,我决定使用x86_64-w 64-mingw 32-g++。
我按照cross-compiling上的cmaks官方文档中提供的说明进行操作,其中我指定了一个工具链文件tc-mingw. cmake。
测试.cpp:
# include "winsock2.h"
int main()
{
pollfd poll_fd;
return 0;
}
CMakeLists.txt文件
cmake_minimum_required(VERSION 3.20)
project(Multi3D)
set(CMAKE_CXX_FLAGS "-std=c++17 -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-std=c++17 -Wall -O3")
find_library(WSOCK32_LIBRARY wsock32 HINTS /usr/x86_64-w64-mingw32/lib/)
find_library(WS2_32_LIBRARY ws2_32 HINTS /usr/x86_64-w64-mingw32/lib/)
if (NOT WSOCK32_LIBRARY OR NOT WS2_32_LIBRARY)
message(FATAL_ERROR "Could not find winsock libraries")
else()
message(STATUS "Windows libs found: ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY}")
endif()
add_executable(testbinary test.cpp)
target_link_libraries(testbinary
${WSOCK32_LIBRARY}
${WS2_32_LIBRARY})
tc-mingw.cmake
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
通话方式
工具链文件=..
查找库
--找到的Windows程式库:第一部分:软件的开发
但奇怪的是会导致编译错误
> error: ‘pollfd’ was not declared in this scope
6 | pollfd poll_fd;
因此,在编译我的编译设置时,winsock类型似乎没有被声明。我不知道为什么!任何帮助都将不胜感激。
我在/usr/x86_64-w 64-mingw 32/include/下进行了检查,这应该是包含文件所在的位置,所有正确的文件都在那里,包括winsock2.h。
1条答案
按热度按时间j9per5c41#
首先,
winsock2.h
是一个系统库,因此使用尖括号而不是双引号更有意义。因此
test.cpp
将看起来应该是这样的:如果我用
g++ -std=c++17 -Wall -O3 test.cpp -o test.exe -lws2_32
和一个最新的版本MinGW-w 64构建它,它会成功(除了warning: unused variable 'poll_fd' [-Wunused-variable]
,这是有意义的)。最新版本为12.2.0。
您可以通过运行
g++ --version
来检查您正在使用的版本。如果在Linux上进行交叉构建,则应将上述命令中的
g++
替换为x86_64-w64-mingw32-g++-win32