将应用程序与包含另一个库的库链接

Posted

技术标签:

【中文标题】将应用程序与包含另一个库的库链接【英文标题】:Link application with a library including another library 【发布时间】:2018-08-05 08:32:30 【问题描述】:

在一个项目中,我正在构建一个 C++ 库和一个使用相同库的示例应用程序。该库应该使用我在另一个项目中构建的另一个库,但我无法将所有这些链接在一起。我在 Linux 中使用 autotools 和 automake。

为了弄清问题,我设置了两个测试项目:test_lib 和 test_use_lib。 test_use_lib 包含示例应用程序和库 libwlib。然后库 libwlib 使用 test_lib 中名为 libtl 的库。

我已将 test_lib 中内置的 libtl.a 文件及其 .h 文件复制到 test_use_lib 中,然后尝试从 libwlib 调用 libtl 中的函数 libtl::hello。

如果我在没有示例应用程序的情况下构建 test_use_lib,那么库 wlib.a 将构建。如果我构建 test_use_lib 而不从 libwlib 调用函数 libtl::hello 那么 libwlib 和示例应用程序都将构建。如果我尝试构建示例应用程序并从 libwlib 调用 libtl::hello,则构建失败。它失败了:

libtool: link: g++ -g -O2 -std=c++11 -pthread -Wall -Wextra -Werror -Wredundant-decls -Wcast-align -Wmissing-declarations -Wmissing-include-dirs -Winvalid-pch -Wredundant-decls -Wformat=2 -Wmissing-format-attribute -Wformat-nonliteral -fvisibility=default -o example example.o  ../../wlib/src/libwlib.a -pthread
../../wlib/src/libwlib.a(wlib.o): In function wlib::hello()':
test_use_lib/wlib/src/wlib.cpp:6: undefined reference to libtl::hello() 

在示例应用程序的 Makefile 中,我使用 LDADD 来包含 libwlib,在 libwlib 的 Makefile 中,我使用 LIBADD 来包含 libtl。

我已将我的两个测试项目放在 github 上:test_lib 和:test_use_lib,如果有人想看看的话。

我非常感谢关于我做错了什么的建议。

/M

【问题讨论】:

【参考方案1】:

您需要将libtl 链接到您的应用程序。请注意,libwlib 是一个静态库,因此无法将任何内容链接到它。相反,需要链接libwlib 依赖项的是libwlib 的用户。

【讨论】:

此外,@Mats,为了满足跨项目边界的这种链接需求,一个项目的构建系统期望另一个项目已经安装是正常的。那么就不需要复制头文件和库文件了。如果这在您的情况下没有意义,那么也许这两个项目应该是一个。 谢谢!我现在在 github 上的测试项目可以按我的意愿工作了。 @JohnBollinger 好评。我将在多个项目中重用“libtl”库,并将其复制到每个要使用它的项目中,从而在我构建将使用它的项目时构建它。我不确定我是否能够在我的项目将运行的机器上安装该库,但我会再考虑一下。

以上是关于将应用程序与包含另一个库的库链接的主要内容,如果未能解决你的问题,请参考以下文章

DLL动态链接库的创建与使用

[APUE]UNIX进程的环境(下)

常用动态链接库的DLL都有哪些?

如何在arduino中制作另一个类库的实例变量

链接我的库的错误的多重定义

linux下的动态链接库和静态链接库到底是个什么鬼?动态链接库的编译与使用