首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__POSIX_VISIBLE在cygwin上毁了我的BSD插座

__POSIX_VISIBLE在cygwin上毁了我的BSD插座
EN

Stack Overflow用户
提问于 2022-11-10 07:05:49
回答 1查看 20关注 0票数 0

我正在使用cygwin开发一个基于websockets的跨平台客户端应用程序。对于unix支持,我尝试在cygwin环境中使用BSD套接字。

问题是编译器包括不定义某些符号。

我正在使用struct addrinfo,编译器正在抱怨

代码语言:javascript
复制
/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宏保护的,这就是为什么我没有得到它。

代码语言:javascript
复制
#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:

代码语言:javascript
复制
...
target_compile_options(${PROJECT_NAME}
    PUBLIC
        $<$<CXX_COMPILER_ID:GNU>:-std=gnu++20>
)
...

但什么都没起作用。我还从usr/include/sys/查看了features.h,其中定义了__POSIX_VISIBLE,如下所示:

代码语言:javascript
复制
#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套接字的支持?

EN

回答 1

Stack Overflow用户

发布于 2022-11-10 07:24:27

解决了。我检查了编译器选项

代码语言:javascript
复制
get_target_property(MAIN_CFLAGS ${PROJECT_NAME} COMPILE_OPTIONS)
message("Target compiler flags are ${MAIN_CFLAGS}")

但是:当我检查实际的生成标志时,使用

代码语言:javascript
复制
make VERBOSE=1

在构建目录中,它在-std=gnu++20之后显示了一个附加的-std=gnu++20标志。

代码语言:javascript
复制
set(CMAKE_CXX_STANDARD 20)

定义在toplevel,这将添加编译器标志-std=c++20在构建阶段(我想),而不是生成阶段,这是混乱的。移除它,现在只有-std=gnu++20才能工作,POSIX是可见的。

更新

我很蠢,因为如果我没有的话,它就会开箱而出。

代码语言:javascript
复制
set(CMAKE_CXX_EXTENSIONS OFF)

当我把它切换到ON CMake为gcc编译器选择GNU++ ..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74385247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档