【发布时间】: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。