为什么用winsock、cmake和mingw编译C++时未声明winsock类型?

b4qexyjb  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(206)

我正在将我在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。

j9per5c4

j9per5c41#

首先,winsock2.h是一个系统库,因此使用尖括号而不是双引号更有意义。
因此test.cpp将看起来应该是这样的:


# include <winsock2.h>

int main()
{
  pollfd poll_fd;

  return 0;
}

如果我用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

相关问题