3

我正在尝试在 linux 上编译一些我知道在 OSX 上编译的代码,但我遇到了一些问题。

所有文件都有名为 .h 的标题,并且所有文件都在同一个目录中。我是这样编译的:

gcc *.c -std=c99 -lpthread

虽然这段代码确实在 OSX 上编译,但我在安装 Ubuntu 时遇到了一堆奇怪的链接器错误。我是否缺少一些编译器选项?它是一个默认的 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]
4

3 回答 3

12

你可能错过了一些#include在 OS X 上隐式引入的 s,但在 Linux 上却没有。

从错误消息来看,您可能至少缺少包括:

  • <signal.h>(为sigset_t和其他人)
  • <fcntl.h>(对于O_*
  • <unistd.h>(一堆东西)
  • <netdb.h>(用于各种网络函数和常量)
  • <stdio.h>(对于getline

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

于 2012-08-25T01:34:07.193 回答
5

我假设直接目标是完全编译代码,一旦完成,您将返回并修改源代码,以便它在两个平台上开箱即用。这意味着黑客在短期内是可以接受的;当您了解可移植性问题时,它们将得到正确修复。(如果有什么安慰的话,最初开发软件的系统的第一个替代系统通常是最难的;之后,它通常会变得更容易。)

首先要尝试的是:

gcc *.c -std=gnu99 -lpthread

这告诉系统头文件定义比-std=c99. (关于这个主题有一些异议,这没关系。至少,如果您添加-pedantic-std=c99编译中,那么除非您还请求 POSIX 支持,否则不会公开 POSIX 定义的标准 C 标头中的符号 - 见下文。因为您不have -pedantic,这可能不是编译中的一个因素,在这种情况下,悄悄地转向下一个建议,这是未来可移植到 POSIX 系统的基础。)

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

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

这表示“为我提供与 POSIX 2008 对应的 POSIX 和 X/Open 函数”。您可以为旧版本尝试 600 和 500,但在 Linux 上您可能不需要这样做。在适当的时候,您可能会_XOPEN_SOURCE通过配置标头或通过配置工具自动设置。当您完全编译时,在命令行上指定它是可以的。在适当的时候,您将使用 amakefile或等效程序来控制编译,而不是gcc在 shell 中键入命令行。)

在 POSIX 下定义sigset_t<signal.h>因此,明确请求 POSIX 支持应该让事情再次正确编译。如果您仍然得到诸如sigset_tundeclared 之类的类型,那么 Mac OS X 上必须有一个标头,其中包含标准标头,例如<signal.h>但它在 Linux 上执行一些不相关的任务(因此不包括<signal.h>)。这将需要源代码审查。但是,它相对不太可能是必要的。

于 2012-08-25T01:33:17.277 回答
2

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

此外,例如 gcc 一直在努力不包含它不应该包含的标题。

是否signalHandling.h包括#include <signal.h>sigset_t 的定义位置?

编辑

与 OP 交谈后,问题似乎是编译/链接问题。首先将源代码编译为目标文件,然后链接它们似乎已经解决了他们的问题。

于 2012-08-25T01:33:49.207 回答