[UNIX]:我是否需要在项目的makefile中添加所有库,这些库是从我的项目中使用的库中使用的?

时间:2011-04-14 13:56:29

标签: c++ unix gcc linker

哈,这听起来比实际更复杂。这就是我的意思:

假设我编写了一个使用线程的应用程序。在此应用程序中,我不直接使用pthreads,但我使用了一个使用pthreads的包装器。因此,在此包装器的makefile中,必须包含-lpthread。问题是 - 我需要在项目中加入-lpthread,还是没有必要?还是取决于?如果是这样,关于什么?

我问这个,因为我已经看过很多了,我认为没必要.. -std=c++0x同样如此?


另外,我遇​​到了Informix C ++接口的问题,因为它依赖于名为DMI的lib,它建立在ESQL/C的顶部。当我删除这些库并仅使用真实的库时,我遇到了链接器问题(查找库的问题)。当我添加dmiesql/c时,一切都很好。

这是否回答了我的问题(“是”),或者我可能做错了什么,除此之外(我是makefile的新手(:)


source:“Makefile是一个神秘的话题 - 一个笑话说世界上只有一个makefile,所有其他makefile只是它的扩展。但是,我向你保证,这个事实并非如此;我不时写自己的文件。“

这让我觉得如果makefile(我公司的项目)中所有包含的库都是必要的,或者这是出于“历史原因”


编辑pthread周围的包装是静态链接的,Informix lib是动态链接的,如果这很重要的话。
此外,操作系统是RHEL(4和5),但我需要知道这是否取决于操作系统和链接方式(动态或静态)

3 个答案:

答案 0 :(得分:2)

除非库以某种方式包含在您正在使用的包装器中,否则答案是肯定的,您需要将它们包含在使用包装器的程序的makefile中。

例如,如果包装器是.o,它还没有链接到任何东西。但是,如果包装器是.so或.a,它可能包括库,具体取决于您构造它的方式。我认为ar对这类事负责。

答案 1 :(得分:1)

这是你犯错误的地方:

  

所以,在这个包装器的makefile中,   必须包含-lpthread

ar工具创建的静态库只是一个特殊文件格式的目标文件集合,后来链接器可以识别。此代码集未链接到任何库。在此阶段编译每个源文件时指定-lpthread是没有意义的,因为没有完成链接。

只有在调用链接器生成所有库和目标文件中的最终可执行文件时,才需要使用-l选项传递特定库。请注意,在此步骤中不会调用编译器,-l不是编译器选项,而是链接器选项。

例如,这只会调用链接器,因为没有提供源文件:

gcc -o myprog main.o -lmylib -lpthread

相比之下,将源文件编译为目标文件并指定库是没有意义的,因为不会执行任何链接:

gcc -c wrapper_source.c -lpthread

答案 2 :(得分:0)

必须存在所有动态链接的库。

通常,当您的应用程序在共享库中使用包装器时,不知道包装器的makefile,并且无法发现它需要包含pthread。另一方面,处理应用程序的链接器通常希望确保项目中没有未定义的符号。

因此,您必须为代码所依赖的所有共享库添加指令。