我想在Linux上编译一些我知道在OSX上编译的代码,但是我遇到了一些问题。
所有这些文件都有名为.h的头文件,并且所有的文件都在同一个目录下。 我正在编译这样的:
gcc *.c -std=c99 -lpthread
虽然这段代码在OSX上编译,但是我的Ubuntu安装却出现了一些奇怪的链接器错误。 我是否缺less一些编译器选项? 这是一个默认的Ubuntu服务器安装与附加软件包gcc
和build-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_r
和pselect
。
我假设直接的目标是完全编译代码,而且一旦完成,您将返回并修改源代码,以便在两个平台上都能正常工作。 这意味着黑客短期内是可以接受的。 当你获得关于可移植性问题的知识时,它们将被正确地修复。 (如果有什么安慰的话,那么软件开发的第一个替代系统通常是最困难的,之后一般会变得更容易)。
首先要尝试的是:
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交谈后,似乎问题是编译/链接问题。 首先将源码编译成目标文件,然后将它们连接起来似乎解决了它们的问题。