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

[UNIX] : Do I need to add all libraries in my project's makefile, that are used from a library, used in my project?

本文关键字:项目 我的 文件 UNIX 是否 添加      更新时间:2023-10-16

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

假设我编写了一个使用线程的应用程序。在这个应用程序中,我没有直接使用pthreads,而是使用了一个使用pthreads的包装器。因此,在这个包装器的makefile中,必须包含-lpthread。问题是-我需要在我的项目中包括-lpthread,还是没有必要?还是看情况?如果有,是基于什么?

我问这个,因为我已经见过很多这样的情况,我认为没有必要…-std=c++0x ?


另外,我在使用Informix c++接口时遇到了一个问题,因为它依赖于一个名为DMI的库,该库构建在ESQL/C之上。当我删除这些库并只使用真正的库时,我遇到了链接器问题(查找库的问题)。当我添加dmiesql/c时,一切正常。

这是否回答了我的问题("是"),或者我可能做错了什么,除了这个(我是新手与makefiles (:)


source: " makefile是一个神秘的话题——有一个笑话说世界上只有一个makefile,所有其他的makefile都只是它的扩展。然而,我向你保证,这不是真的;我不时地写我自己的makefile。"

这让我想到,是否所有包含在make文件中的库(我公司项目的)都是必要的,或者这是出于"历史原因"


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

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

例如,如果包装器是.o,它还没有链接到任何东西。但是,如果包装器是.so或.a,则它可能包含库,这取决于您如何构造它。我认为是造成了这种情况。

这就是你犯的错误:

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

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

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

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

gcc -o myprog main.o -lmylib -lpthread

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

gcc -c wrapper_source.c -lpthread

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

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

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