假设我编写了一个使用线程的应用程序。在此应用程序中,我不直接使用pthreads
,但我使用了一个使用pthreads
的包装器。因此,在此包装器的makefile中,必须包含-lpthread
。问题是 - 我需要在项目中加入-lpthread
,还是没有必要?还是取决于?如果是这样,关于什么?
我问这个,因为我已经看过很多了,我认为没必要.. -std=c++0x
同样如此?
另外,我遇到了Informix C ++接口的问题,因为它依赖于名为DMI
的lib,它建立在ESQL/C
的顶部。当我删除这些库并仅使用真实的库时,我遇到了链接器问题(查找库的问题)。当我添加dmi
和esql/c
时,一切都很好。
这是否回答了我的问题(“是”),或者我可能做错了什么,除此之外(我是makefile的新手(:)
source:“Makefile是一个神秘的话题 - 一个笑话说世界上只有一个makefile,所有其他makefile只是它的扩展。但是,我向你保证,这个事实并非如此;我不时写自己的文件。“
这让我觉得如果makefile(我公司的项目)中所有包含的库都是必要的,或者这是出于“历史原因”
编辑:pthread
周围的包装是静态链接的,Informix
lib是动态链接的,如果这很重要的话。
此外,操作系统是RHEL(4和5),但我需要知道这是否取决于操作系统和链接方式(动态或静态)
答案 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。另一方面,处理应用程序的链接器通常希望确保项目中没有未定义的符号。
因此,您必须为代码所依赖的所有共享库添加指令。