[UNIX]:我是否需要在项目的生成文件中添加所有库,这些库是从库中使用的,在我的项目中使用的?
[UNIX] : Do I need to add all libraries in my project's makefile, that are used from a library, used in my project?
哈,这听起来比实际情况更复杂。我的意思是:
假设我编写了一个使用线程的应用程序。在这个应用程序中,我没有直接使用pthreads
,而是使用了一个使用pthreads
的包装器。因此,在这个包装器的makefile中,必须包含-lpthread
。问题是-我需要在我的项目中包括-lpthread
,还是没有必要?还是看情况?如果有,是基于什么?
我问这个,因为我已经见过很多这样的情况,我认为没有必要…-std=c++0x
?
另外,我在使用Informix c++接口时遇到了一个问题,因为它依赖于一个名为DMI
的库,该库构建在ESQL/C
之上。当我删除这些库并只使用真正的库时,我遇到了链接器问题(查找库的问题)。当我添加dmi
和esql/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。另一方面,在应用程序上工作的链接器通常希望确保项目中没有未定义的符号。
因此,你必须为你的代码所依赖的所有共享库添加指令。
- cmake在我的项目中所需的所有静态库都不成功
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 如何将我的 CMake 项目配置为运行所有单元测试?
- 编译器现在遵循C++14标准,我的项目不再编译神秘的SFML错误
- 如何在我的项目中从 CMAKE 中的同一项目获取多个库
- 为什么我的项目没有保存名称中所做的修改
- 如何将我的小程序转换为用于项目的函数?
- 如何在我的 Visual C++ 项目中使用 .a 文件
- 如何自动获取我的项目的路径并删除一些文件
- Qt - 为什么Visual Studio 2019在qml资源中添加10Mb文件后无法再编译我的项目?
- 我必须构建我的项目 2 次,第一次失败,因为它无法打开库
- 我怎样才能简单地将opencv 包含在我的项目中与CMake
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- 部署基于 qt 的项目后,我的 sqlite3 文件不会被复制 (android)
- 如何将外部 dll 添加到我的 VS2019 项目?
- 如何在Cmake中正确查找头路径,以便在我的项目中构建Box2D
- 阻止我的项目调用__CxxFrameHandler3(CRT函数)
- 我的项目中某些仅标头文件不能包含使用 CMake 和 Vscode 的"SFML/Graphics.hpp"
- 如何从支持linux/mac操作系统的第三方代码为我的c#项目创建dll
- 如何在bazel中同时处理外部依赖项和我的项目