[UNIX]:我是不是需要在项目的 makefile 中添加所有库,这些库从库中使用,在我的项目中使用?
Posted
技术标签:
【中文标题】[UNIX]:我是不是需要在项目的 makefile 中添加所有库,这些库从库中使用,在我的项目中使用?【英文标题】:[UNIX] : Do I need to add all libraries in my project's makefile, that are used from a library, used in my project?[UNIX]:我是否需要在项目的 makefile 中添加所有库,这些库从库中使用,在我的项目中使用? 【发布时间】:2011-04-14 13:56:29 【问题描述】:哈,这听起来比实际上更复杂。这就是我的意思:
假设我编写了一个使用线程的应用程序。在这个应用程序中,我没有直接使用pthreads
,而是使用了一个包装器,它使用了pthreads
。因此,在此包装器的 makefile 中,必须包含 -lpthread
。还有一个问题——我需要在我的项目中包含-lpthread
,还是没有必要?还是视情况而定?如果有,在什么方面?
我问这个,因为我见过很多,我认为没有必要。-std=c++0x
也一样?
另外,我在使用 Informix C++ 接口时遇到了问题,因为它依赖于名为 DMI
的 lib,它构建在 ESQL/C
之上。当我删除这些库并只使用真正的库时,我遇到了链接器问题(查找库的问题)。当我添加dmi
和esql/c
时,一切都很好。
这是否回答了我的问题(使用“是”),或者我可能做错了什么,除此之外(我是 makefile 的新手 (:)
source: “Makefile 是一个神秘的话题——有一个笑话说世界上只有一个 makefile,而所有其他的 makefile 只是它的扩展。但是我向你保证,这不是是的;我不时编写自己的 makefile。”
这让我想到(我公司项目的)makefile 中包含的所有库是否都是必要的,或者这是出于“历史原因”
编辑:pthread
的包装器是静态链接的,Informix
库是动态链接的,如果这很重要的话。
此外,操作系统是 RHEL(4 和 5),但我需要知道这是否取决于操作系统和链接方式(动态或静态)
【问题讨论】:
库能够具有传递依赖。现在,有几个 Linux 变体支持它,但有些又开始禁用它(比如 Fedora)。有些操作系统从来没有。为清楚起见,要求使用所有库似乎是合理的。但是,像 automake/cmake 这样的构建系统会为您解决这个问题。 这个包装器是静态库还是动态库,或者仅仅是目标文件的集合,这个问题不是很清楚。 【参考方案1】:除非库以某种方式包含在您使用的包装器中,否则答案是肯定的,您需要将它们包含在使用包装器的程序的 makefile 中。
例如,如果包装器是 .o,它还没有链接到任何东西。但是,如果包装器是 .so 或 .a,它可能包含库,具体取决于您构建它的方式。我认为ar负责这种事情。
【讨论】:
“但是,如果包装器是 .so 或 .a,它可能包含库,具体取决于您如何构建它” - 我不确定... 静态链接和归档。【参考方案2】:这是你犯错的地方:
所以,在这个包装器的 makefile 中, -lpthread 必须包含
ar
工具创建的静态库只是链接器稍后识别的特殊文件格式的目标文件的集合。此代码集合未链接到任何库。在此阶段编译每个源文件时指定-lpthread
是没有意义的,因为没有进行链接。
只有在调用链接器以从所有库和目标文件中生成最终可执行文件时,您才需要使用 -l
选项传递特定库。注意,这一步不会调用编译器,-l
不是编译器选项,而是链接器选项。
例如,这仅调用链接器,因为没有提供源文件:
gcc -o myprog main.o -lmylib -lpthread
相比之下,将源文件编译为目标文件并指定库是没有意义的,因为不会执行链接:
gcc -c wrapper_source.c -lpthread
【讨论】:
所以,让我们概括一下:我不需要在包装器的makefile中包含-lpthread
,如果我从中创建一个.o
文件,因为我稍后会link
这个选项必须包含在我的项目的makefile中,对吧?但是,如果我将包装器编译为.a
或.so
并动态链接它,我需要在包装器的makefile 中添加-lpthread
而在我的项目的makefile 中添加not?如我错了请纠正我。 Мерси (:
简而言之,在创建静态库或编译到目标文件时,永远不要尝试链接到库。链接是关于解析可执行代码中的所有符号。 Благодаря :-)【参考方案3】:
所有动态链接的库都必须存在。
通常,当您的应用程序在共享库中使用包装器时,不知道包装器的 makefile 并且无法发现它需要包含 pthread。另一方面,在您的应用程序上工作的链接器通常确实希望确保项目中没有未定义的符号。
因此,您必须为您的代码所依赖的所有共享库添加指令。
【讨论】:
动态链接?我认为动态链接库背后的想法是您可以单独编译其余部分,并在运行时添加库。您的意思是直接还是间接相关?以上是关于[UNIX]:我是不是需要在项目的 makefile 中添加所有库,这些库从库中使用,在我的项目中使用?的主要内容,如果未能解决你的问题,请参考以下文章
从 Visual Studio 2008 解决方案创建 Unix makefile