Linux上C代码的编译错误(在OSX上编译相同的代码)

我想在Linux上编译一些我知道在OSX上编译的代码,但是我遇到了一些问题。

所有这些文件都有名为.h的头文件,并且所有的文件都在同一个目录下。 我正在编译这样的:

gcc *.c -std=c99 -lpthread 

虽然这段代码在OSX上编译,但是我的Ubuntu安装却出现了一些奇怪的链接器错误。 我是否缺less一些编译器选项? 这是一个默认的Ubuntu服务器安装与附加软件包gccbuild-essential安装。

 In file included from errorLogger.h:24:0, from configParser.h:17, from configParser.c:9: signalHandling.h:24:18: error: unknown type name 'sigset_t' configParser.c: In function 'parseConfigFile': configParser.c:114:5: warning: implicit declaration of function 'getline' [-Wimplicit-function-declaration] In file included from errorLogger.h:24:0, from global.h:18, from connection.h:19, from connection.c:10: signalHandling.h:24:18: error: unknown type name 'sigset_t' connection.c: In function 'createConnectionQueue': connection.c:189:28: warning: assignment makes integer from pointer without a cast [enabled by default] In file included from errorLogger.h:24:0, from database.h:16, from database.c:9: signalHandling.h:24:18: error: unknown type name 'sigset_t' In file included from errorLogger.h:24:0, from errorLogger.c:10: signalHandling.h:24:18: error: unknown type name 'sigset_t' errorLogger.c: In function 'reportError': errorLogger.c:63:5: warning: implicit declaration of function 'strerror_r' [-Wimplicit-function-declaration] errorLogger.c: In function 'logMessage': errorLogger.c:87:5: warning: implicit declaration of function 'localtime_r' [-Wimplicit-function-declaration] errorLogger.c: In function 'processErrorQueue': errorLogger.c:131:17: warning: implicit declaration of function 'open' [-Wimplicit-function-declaration] errorLogger.c:131:57: error: 'O_APPEND' undeclared (first use in this function) errorLogger.c:131:57: note: each undeclared identifier is reported only once for each function it appears in errorLogger.c:131:68: error: 'O_CREAT' undeclared (first use in this function) errorLogger.c:131:78: error: 'O_WRONLY' undeclared (first use in this function) errorLogger.c:131:88: error: 'S_IWRITE' undeclared (first use in this function) errorLogger.c:131:99: error: 'S_IREAD' undeclared (first use in this function) errorLogger.c:146:13: warning: implicit declaration of function 'fsync' [-Wimplicit-function-declaration] errorLogger.c: In function 'startErrorLogger': errorLogger.c:167:36: error: 'O_APPEND' undeclared (first use in this function) errorLogger.c:167:47: error: 'O_CREAT' undeclared (first use in this function) errorLogger.c:167:57: error: 'O_WRONLY' undeclared (first use in this function) errorLogger.c:167:67: error: 'S_IWRITE' undeclared (first use in this function) errorLogger.c:167:78: error: 'S_IREAD' undeclared (first use in this function) errorLogger.c:214:57: error: 'O_EXCL' undeclared (first use in this function) errorLogger.c:231:27: warning: assignment makes integer from pointer without a cast [enabled by default] errorLogger.c: In function 'closeErrorLogger': errorLogger.c:246:9: warning: implicit declaration of function 'pthread_kill' [-Wimplicit-function-declaration] In file included from errorLogger.h:24:0, from global.h:18, from global.c:9: signalHandling.h:24:18: error: unknown type name 'sigset_t' In file included from main.c:23:0: signalHandling.h:24:18: error: unknown type name 'sigset_t' main.c: In function 'main': main.c:53:5: warning: implicit declaration of function 'blockSignals' [-Wimplicit-function-declaration] main.c:61:45: error: invalid application of 'sizeof' to incomplete type 'struct addrinfo' main.c:62:29: error: invalid application of 'sizeof' to incomplete type 'struct addrinfo' main.c:64:10: error: dereferencing pointer to incomplete type main.c:65:10: error: dereferencing pointer to incomplete type main.c:66:10: error: dereferencing pointer to incomplete type main.c:66:23: error: 'AI_PASSIVE' undeclared (first use in this function) main.c:66:23: note: each undeclared identifier is reported only once for each function it appears in main.c:69:5: warning: implicit declaration of function 'getaddrinfo' [-Wimplicit-function-declaration] main.c:73:9: warning: implicit declaration of function 'gai_strerror' [-Wimplicit-function-declaration] main.c:73:9: warning: format '%s' expects argument of type 'char *', but argument 4 has type 'int' [-Wformat] main.c:73:9: warning: format '%s' expects argument of type 'char *', but argument 4 has type 'int' [-Wformat] main.c:81:41: error: dereferencing pointer to incomplete type main.c:83:30: error: dereferencing pointer to incomplete type main.c:83:46: error: dereferencing pointer to incomplete type main.c:83:64: error: dereferencing pointer to incomplete type main.c:96:30: error: dereferencing pointer to incomplete type main.c:96:44: error: dereferencing pointer to incomplete type main.c:112:5: warning: implicit declaration of function 'freeaddrinfo' [-Wimplicit-function-declaration] main.c:138:9: error: unknown type name 'fd_set' main.c:142:9: warning: implicit declaration of function 'FD_ZERO' [-Wimplicit-function-declaration] main.c:143:9: warning: implicit declaration of function 'FD_SET' [-Wimplicit-function-declaration] main.c:145:9: warning: implicit declaration of function 'pselect' [-Wimplicit-function-declaration] In file included from signalHandling.c:10:0: signalHandling.h:24:18: error: unknown type name 'sigset_t' signalHandling.c:12:18: error: unknown type name 'sigset_t' signalHandling.c: In function 'setHandler': signalHandling.c:51:53: error: invalid application of 'sizeof' to incomplete type 'struct sigaction' signalHandling.c:52:36: error: invalid application of 'sizeof' to incomplete type 'struct sigaction' signalHandling.c:54:5: warning: implicit declaration of function 'sigemptyset' [-Wimplicit-function-declaration] signalHandling.c:54:30: error: dereferencing pointer to incomplete type signalHandling.c:60:9: warning: implicit declaration of function 'sigaddset' [-Wimplicit-function-declaration] signalHandling.c:60:35: error: dereferencing pointer to incomplete type signalHandling.c:67:17: error: dereferencing pointer to incomplete type signalHandling.c:72:9: warning: implicit declaration of function 'sigaction' [-Wimplicit-function-declaration] 

你可能会错过一些在OS X上隐式引入的#include ,而不是在Linux上。

从错误信息来看,你可能至少缺少包括:

  • <signal.h> (对于sigset_t等)
  • <fcntl.h> (对于O_*
  • <unistd.h> (对于一堆东西)
  • <netdb.h> (用于各种网络功能和常量)
  • <stdio.h> (用于getline

您可能还需要定义一些功能宏(例如_POSIX_C_SOURCE )来获取某些与系统相关的功能,包括strerror_rpselect

我假设直接的目标是完全编译代码,而且一旦完成,您将返回并修改源代码,以便在两个平台上都能正常工作。 这意味着黑客短期内是可以接受的。 当你获得关于可移植性问题的知识时,它们将被正确地修复。 (如果有什么安慰的话,那么软件开发的第一个替代系统通常是最困难的,之后一般会变得更容易)。

首先要尝试的是:

 gcc *.c -std=gnu99 -lpthread 

这告诉系统头文件比-std=c99定义更多的符号。 (在这个主题上有一些不同意见,这是可以的,至少如果你在-std=c99编译中添加-pedantic ,那么除非你还要求POSIX支持,否则POSIX定义的标准C头文件中的符号不​​会被公开 – 见下。由于你没有-pedantic ,这可能不是编辑中的一个因素,在这种情况下,悄悄地转向下一个建议,这是未来POSIX系统可移植性的基础。)

如果这不足以让你回到正轨,那么你可能需要使用像这样的东西:

 gcc *.c -std=gnu99 -D_XOPEN_SOURCE=700 -lpthread 

这就是说“提供POSIX 2008对应的POSIX和X / Open功能”。 你可以尝试600和500的旧版本,但是你可能不需要在Linux上这样做。 在适当的时候,您可能会自动设置_XOPEN_SOURCE ,通过配置标题或通过配置工具。 当你想要编译的时候,在命令行中指定它是可以的。 在适当的时候,你将使用一个makefile或等价的方式来控制编译,而不是在shell中输入一个gcc命令行。)

sigset_t在POSIX下的<signal.h><signal.h> 。 所以,明确请求POSIX支持应该重新编译。 如果仍然得到sigset_t未声明的类型,那么在Mac OS X上必须有一个包含标准头文件(如<signal.h>头文件,但它在Linux上执行一些不相关的任务(因此不包含<signal.h> )。 这将需要源代码审查。 但是,这是不太可能的。

您需要包含额外的头文件,因为不同的系统头包含其他不同的系统头。

也例如,海湾合作委员会一直努力工作,不包括它不应该包含的标题。

signalHandling.h包括#include <signal.h> sigset_t是在哪里定义的?

编辑

与OP交谈后,似乎问题是编译/链接问题。 首先将源码编译成目标文件,然后将它们连接起来似乎解决了它们的问题。