编译时出现错误?

8

当我编译代码时,出现了以下错误。我已经将所有头文件放在user/include下。

g++ -Ip_appmanager/inc -Icore/inc p_appmanager/src/appmanager_process.cpp -o p_appmanager/obj/appmanager -lpthread -lparser
p_appmanager/src/appmanager_process.cpp: In function ‘int main(int, char**)’:
p_appmanager/src/appmanager_process.cpp:33:21: error: ‘getpid’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:101:19: error: ‘fork’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:105:70: error: ‘execl’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:109:19: error: ‘getppid’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:124:19: error: ‘fork’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:128:61: error: ‘execl’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:132:19: error: ‘getppid’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:147:19: error: ‘fork’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:151:73: error: ‘execl’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:155:19: error: ‘getppid’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:170:19: error: ‘fork’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:175:70: error: ‘execl’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:179:19: error: ‘getppid’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp: In function ‘void* pingThread(void*)’:
p_appmanager/src/appmanager_process.cpp:302:11: error: ‘sleep’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp: In function ‘void* fifoThread(void*)’:
p_appmanager/src/appmanager_process.cpp:815:22: error: ‘fork’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:818:72: error: ‘execl’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:842:64: error: ‘execl’ was not declared in this scope
p_appmanager/src/appmanager_process.cpp:865:72: error: ‘execl’ was not declared in this scope
make: *** [all] Error 1

我的内核版本是“Linux amit-bhaira 3.8.0-26-generic #38-Ubuntu SMP Mon Jun 17 21:46:08 UTC 2013 i686 i686 i686 GNU/Linux”。同样的代码在另一台Linux机器上运行。

请帮我解决这个问题。

谢谢。


你的代码包括 <unistd.h> 吗? - Oliver Matthews
1
你真的相信我们可以在不看代码的情况下魔法般地解决你的编译器错误吗? - user529758
1
@H2CO3:对于那些特定的,是的。 - Ignacio Vazquez-Abrams
如果您安装了适当的手册页,您可以使用例如 man getpid 或其他函数来获取大部分信息。手册将告诉您应该包含哪个头文件以及可选的链接信息。 - hetepeperfan
@IgnacioVazquez-Abrams 错误的态度。 - user529758
抱歉打扰大家..实际上同样的代码在另一个系统上是可以工作的,所以我认为unistd.h被包含在其他头文件中,但我不知道这个事实:"旧版本的gcc (<4.7)在一些系统头文件中意外地包含了unistd.h"。 - Amit Bhaira
3个回答

55

添加#include <unistd.h>

在其他平台上,这个代码可以正常工作,因为它们使用旧版本的gcc(<4.7)进行编译,这些版本中的一些系统头文件意外地包含了unistd.h。


6

来自 fork(2) man 手册:

SYNOPSIS
       #include <unistd.h>

来自exec(3)手册页:

SYNOPSIS
       #include <unistd.h>

来自 getpid(2) 操作手册:

SYNOPSIS
       #include <sys/types.h>
       #include <unistd.h>

来自 sleep(3) 手册:

SYNOPSIS
       #include <unistd.h>

3
你的程序中忘记了 #include <unistd.h>

不,我没有。我已经提到了同样的代码在另一台Linux机器上运行。 - Amit Bhaira
1
很可能被其他头文件吸收了 - 这种情况确实会发生。由于您的代码有意使用 forkexecl 等功能,因此应该自己包含它,而不是依赖于间接包含。 - Mats Petersson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接