我正在使用cygwin开发一个基于websockets的跨平台客户端应用程序。对于unix支持,我尝试在cygwin环境中使用BSD套接字。
问题是编译器包括不定义某些符号。
我正在使用struct addrinfo,编译器正在抱怨
/cygdrive/c/dev/supabase-cpp/extern/realtime-cpp/src/port_unix.h:62:5: Fehler: »addrinfo« wurde in diesem Gültigkeitsbereich nicht definiert
62 | addrinfo *result = NULL, *ptr = NULL, hints;
| ^~~~~~~~或在此范围内未定义addrinfo。
我已经查看了头文件的netdb.h,该文件应该定义addrinfo,它是C中的addrinfo:\ cygwin 64\usr\include(在cygwin树中还有另外4个版本的头文件,但是AFAIK,这是编译器正在寻找的)。
我看到addrinfo是在那里定义的,但是它是由__POSIX_VISIBLE宏保护的,这就是为什么我没有得到它。
#if __POSIX_VISIBLE >= 200112 && !defined(__INSIDE_CYGWIN_NET__)
struct addrinfo {
int ai_flags; /* input flags */
int ai_family; /* address family of socket */
int ai_socktype; /* socket type */
int ai_protocol; /* ai_protocol */
socklen_t ai_addrlen; /* length of socket address */
char *ai_canonname; /* canonical name of service location */
struct sockaddr *ai_addr; /* socket address of socket */
struct addrinfo *ai_next; /* pointer to next in list */
};
#endif因为我检查并将__POSIX_VISIBLE设置为0。我在这里看了一个类似命名的主题__POSIX_VISIBLE is ruining my pthreading on cygwin,对于定义__POSIX_VISIBLE的共识,编译器必须设置为-std=gnu++NN。我试着用-std=gnu++14和-std=gnu++20这样的方式:
CMakeLists.txt:
...
target_compile_options(${PROJECT_NAME}
PUBLIC
$<$<CXX_COMPILER_ID:GNU>:-std=gnu++20>
)
...但什么都没起作用。我还从usr/include/sys/查看了features.h,其中定义了__POSIX_VISIBLE,如下所示:
#if (_POSIX_C_SOURCE - 0) >= 200809L
#define __POSIX_VISIBLE 200809
#elif (_POSIX_C_SOURCE - 0) >= 200112L
#define __POSIX_VISIBLE 200112
#elif (_POSIX_C_SOURCE - 0) >= 199506L
#define __POSIX_VISIBLE 199506
#elif (_POSIX_C_SOURCE - 0) >= 199309L
#define __POSIX_VISIBLE 199309
#elif (_POSIX_C_SOURCE - 0) >= 2 || defined(_XOPEN_SOURCE)
#define __POSIX_VISIBLE 199209
#elif defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE)
#define __POSIX_VISIBLE 199009
#else
#define __POSIX_VISIBLE 0
#endif当我在代码中签入时,__POSIX_VISIBLE设置为0,因此显然既没有设置_POSIX_SOURCE,也没有设置_POSIX_C_SOURCE。
如何设置__POSIX_VISIBLE以便在cygwin下编译时启用对BSD套接字的支持?
发布于 2022-11-10 07:24:27
解决了。我检查了编译器选项
get_target_property(MAIN_CFLAGS ${PROJECT_NAME} COMPILE_OPTIONS)
message("Target compiler flags are ${MAIN_CFLAGS}")但是:当我检查实际的生成标志时,使用
make VERBOSE=1在构建目录中,它在-std=gnu++20之后显示了一个附加的-std=gnu++20标志。
set(CMAKE_CXX_STANDARD 20)定义在toplevel,这将添加编译器标志-std=c++20在构建阶段(我想),而不是生成阶段,这是混乱的。移除它,现在只有-std=gnu++20才能工作,POSIX是可见的。
更新
我很蠢,因为如果我没有的话,它就会开箱而出。
set(CMAKE_CXX_EXTENSIONS OFF)当我把它切换到ON CMake为gcc编译器选择GNU++ ..。
https://stackoverflow.com/questions/74385247
复制相似问题