【问题标题】:Include shared library into Linux application using CMake – GCC linker errors使用 CMake 将共享库包含到 Linux 应用程序中 – GCC 链接器错误
【发布时间】:2018-07-31 13:29:51
【问题描述】:

我在 Visual Studio 的环境下构建我的应用程序没有问题,但由于缺乏经验,我在 Linux/GCC 下遇到了麻烦。虽然 GCC 成功编译了我的应用程序,但它报告了链接器错误

我做的第一件事是使用 CMakeLists.txt 构建一个共享库。该文件没有“make install”,因此我手动将共享库文件复制到全局位置,如下所示:

sudo cp libibpp.a /usr/local/lib/

由于使用 IBPP 库构建的应用程序需要您包含单个头文件,因此我将其复制到了一个全局位置:

sudo cp ibpp.h /usr/local/include/

到目前为止,一切都很好,但是当我为我的应用程序运行 CMake 时,我遇到了链接器错误,例如:

undefined reference to ‘isc_create_database’

我在我的应用程序中成功使用了许多“共享库”(例如 Boost Regex/Filesystem/Chrono/DateTime/Thread)。我使用的唯一“静态库”是 IBPP (libibpp.a)。 我怀疑我在应用程序的 CMakeListst.txt 中遗漏了一些内容:

cmake_minimum_required(VERSION 3.10.2)
project(myapp)
file(GLOB src "*.h" "*.cpp")
add_executable(myapp ${src})
target_link_libraries(myapp ibpp icuuc icudata boost_regex boost_system boost_filesystem 
boost_chrono boost_date_time boost_thread pthread)
add_definitions(-DIBPP_LINUX)

有人可以向我提供一些提示,说明为什么我会收到与 IBPP 相关的链接器错误吗?

更新:

用户 n.m.要求我使用 VERBOSE 选项进行构建,所以这是输出:

/usr/bin/cmake -E cmake_link_script CMakeFiles/myapp.dir/link.txt --verbose=1
/usr/bin/c++     CMakeFiles/myapp.dir/appServer.cpp.o CMakeFiles/myapp.dir/app_env.cpp.o CMakeFiles/myapp.dir/app_setting.cpp.o CMakeFiles/myapp.dir/authenticationServer.cpp.o CMakeFiles/myapp.dir/bustacheTestStencil.cpp.o CMakeFiles/myapp.dir/commonKeys.cpp.o CMakeFiles/myapp.dir/dataFetcher.cpp.o CMakeFiles/myapp.dir/fighterKeys.cpp.o CMakeFiles/myapp.dir/fighterProfileJsonGenerator.cpp.o CMakeFiles/myapp.dir/fighterProfileMarkupGenerator.cpp.o CMakeFiles/myapp.dir/fighterStorage.cpp.o CMakeFiles/myapp.dir/forwardProxyServer.cpp.o CMakeFiles/myapp.dir/headerProcessor.cpp.o CMakeFiles/myapp.dir/homepageStencil.cpp.o CMakeFiles/myapp.dir/httpUtils.cpp.o CMakeFiles/myapp.dir/locale.cpp.o CMakeFiles/myapp.dir/main.cpp.o CMakeFiles/myapp.dir/markupServer.cpp.o CMakeFiles/myapp.dir/myTools.cpp.o CMakeFiles/myapp.dir/stdafx.cpp.o CMakeFiles/myapp.dir/unicodeFunctions.cpp.o CMakeFiles/myapp.dir/utils.cpp.o  -o myapp -libpp -licutu -licutest -licuio -licui18n -licuuc -licudata -lboost_regex -lboost_system -lboost_filesystem -lboost_chrono -lboost_date_time -lbustache -lboost_thread -lpthread 
//usr/local/lib/libibpp.a(_ibpp.cpp.o): In function `ibpp_internals::GDS::Call()':
_ibpp.cpp:(.text+0x2c): undefined reference to `isc_create_database'
_ibpp.cpp:(.text+0x3b): undefined reference to `isc_attach_database'
....
_ibpp.cpp:(.text+0x2bd): undefined reference to `isc_service_start'
_ibpp.cpp:(.text+0x2cf): undefined reference to `isc_service_query'
collect2: error: ld returned 1 exit status
CMakeFiles/myapp.dir/build.make:640: recipe for target 'myapp' failed
make[2]: *** [myapp] Error 1
make[2]: Leaving directory '/home/carol/Documents/vm_shared/AppServer/build'
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/myapp.dir/all' failed
make[1]: *** [CMakeFiles/myapp.dir/all] Error 2
make[1]: Leaving directory '/home/carol/Documents/vm_shared/AppServer/build'
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

【问题讨论】:

  • 如果可以的话,请将您的最低 CMake 版本增加到 3 的版本。你如何链接到 boost,甚至包括它的标题?我在 CMakeLists.txt 中没有看到 find_package(Boost) 命令。您应该使用find_library 来查找 ibpp 库。
  • 运行make VERBOSE=1 并显示链接器调用
  • @John,嗨,我刚刚查了一下,版本是 cmake 版本 3.10.2。以上是我的整个 CMakeLists.txt。如果我删除 'ibpp' 库,它工作正常。我应该发布用于构建 IBPP 库的 CMakeLists.txt 吗?
  • @n.m.,您好,我在原始问题中添加了 VERBOSE 输出。即使我在构建 libibpp.a 时没有出错,我用来构建 IBPP 的 CMake 文本文件是否有问题?请指教。哦,请注意,当我引入 libibpp.a 时,我的链接器问题就开始了。
  • 在我的系统上,isc_create_database 位于两个库中,称为 fbclient 和 gds。 (实际上两者都是指向同一个库的符号链接)。在您的链接器调用中都没有使用。您可能需要将其中之一添加到target_link_libraries

标签: linux gcc cmake


【解决方案1】:

感谢 n.m. 的评论,问题解决了。更多。由于我没有包含 libfbclient,因此我收到了“对 'isc_create_database' 的未定义引用和其他 'isc_...' 消息。

使用下面的设置,我现在可以使用我的预编译/构建的 IBPP 库,而不必将源代码包含到我的应用程序中!

这是一个简化的、非常简单的 CMakeLists.txt,它演示了在您的应用中实现 IBPP.a 所需的内容,而无需将 IBPP 源代码包含到您的应用中:

file(GLOB src "*.cpp")
add_executable(myapp ${src})
target_link_libraries(myapp ibpp fbclient)

记下顺序,libibpp 必须在 libfbclient 之前。

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 2017-05-29
    • 2010-10-18
    • 2012-09-06
    • 2015-10-08
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多