[UNIX]:是否需要在项目的Makefile中添加从项目中使用的库中使用的所有库?

| 哈,这听起来比实际要复杂。这是我的意思: 假设我编写了一个使用线程的应用程序。在此应用程序中,我没有直接使用
pthreads
,而是使用了一个使用
pthreads
的包装器。因此,在该包装的makefile中,必须包含
-lpthread
。问题是-我是否需要在项目中包含ѭ2?还是没有必要?还是取决于?如果是这样,那又是什么? 我问这个问题是因为我已经看过很多次了,所以我认为这不是必需的。
-std=c++0x
也是吗? 另外,我还有一个Informix C ++接口的问题,因为它依赖于名为
DMI
的lib,该库建于
ESQL/C
的顶部。当我删除这些库并仅使用真正的库时,出现链接器问题(查找库的问题)。当我加上
dmi
esql/c
时,一切都很好。 这是否回答了我的问题(使用\“ YES \”),或者我做错了什么,否则(我是makefiles(:)的新手。 来源:“ Makefile是一个不可思议的话题–开个玩笑,世界上只有一个Makefile,而所有其他Makefile只是它的扩展。但是,我向您保证,这不是真的;我拥有不时编写自己的makefile。” 这使我想到是否需要(我公司的项目的)makefile中包含的所有库,或者这是出于“历史原因” 编辑:围绕
pthread
的包装是静态链接的,而
Informix
lib是动态链接的,如果这很重要。 另外,操作系统是RHEL(4和5),但是我需要知道这是否取决于操作系统以及链接方式(动态或静态)。     
已邀请:
这是您犯错的地方:   因此,在该包装器的makefile中,   -lpthread必须包含 ѭ11工具创建的静态库只是目标文件的一种特殊文件格式的集合,链接器稍后会识别这些文件。此代码集合未链接到任何库。在此阶段编译每个源文件时指定
-lpthread
是没有意义的,因为没有链接。 仅当调用链接器从所有库和目标文件中生成最终可执行文件时,才需要使用
-l
选项传递特定的库。请注意,此步骤未调用编译器,并且<13>不是编译器选项,而是链接器选项。 例如,这仅调用链接器,因为没有提供源文件:
gcc -o myprog main.o -lmylib -lpthread
相比之下,将源文件编译为目标文件并指定库是没有意义的,因为将不执行链接:
gcc -c wrapper_source.c -lpthread
    
除非库以某种方式包含在您使用的包装器中,否则答案为是,则需要将它们包含在使用包装器的程序的makefile中。 例如,如果包装器是.o,则它尚未链接到任何东西。但是,如果包装器是.so或.a,则取决于您的构造方式,它可能包括库。我认为ar负责这种事情。     
必须存在所有动态链接的库。 通常,当您的应用程序在共享库中使用包装器时,不知道包装器的makefile,并且无法发现它需要包含pthread。另一方面,在您的应用程序上运行的链接程序通常确实希望确保项目中没有剩余的未定义符号。 因此,您将必须为代码所依赖的所有共享库添加指令。     

要回复问题请先登录注册