:我是否需要在项目的makefile中添加库中使用的所有库,在我的项目中使用?

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

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

我问这个,因为我已经看到了很多,我不认为这是必要的。同样的-std=c++0x


另外,由于Informix C ++接口依赖于称为DMI lib,因此它在ESQL/C基础上构build,所以我遇到了一个问题。 当我删除这些库,只使用真正的,我有链接器的问题(find库的问题)。 当我添加dmiesql/c ,一切都很好。

这是否回答我的问题(与“是”),或者我可以做错了什么,除了这个(我是新手使用makefiles(:)


来源 :“制造文件是一个神秘的话题 – 有一个笑话是,世界上只有一个makefile,所有其他makefile只是它的扩展,但我向你保证,这是不正确的;我写我自己的makefiles不时“。

这使我想,如果所有包含在我公司项目的makefile中的库都是必需的,或者这是出于“历史原因”


编辑 :围绕pthread的包装是链接静态,和Informix库dynamic链接,如果这个问题。
此外,操作系统是RHEL(4和5),但我需要知道这是否取决于操作系统和链接的方式(dynamic或静态)

这是你犯了一个错误的地方:

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

ar工具创建的静态库仅仅是特殊文件格式的对象文件的集合,后者由链接器识别。 这个代码集合没有链接到任何库。 在此阶段编译每个源文件时指定-lpthread是毫无意义的,因为没有链接完成。

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

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

 gcc -o myprog main.o -lmylib -lpthread 

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

 gcc -c wrapper_source.c -lpthread 

除非这些库被包含在你正在使用的包装器中,否则答案是YES,你将需要将它们包含在使用包装器的程序的生成文件中。

例如,如果包装是.o,它还没有链接到任何东西。 但是,如果包装是一个.so或.a,它可能包括库取决于你如何构建它。 我认为阿尔是负责这种事情。

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

通常,当您的应用程序在共享库中使用包装器时,不知道包装器的生成文件,并且不能发现它需要包含pthread。 另一方面,在您的应用程序上工作的链接器通常确实需要确保项目中没有未定义的符号。

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