使用CMake将共享库包含在Linux应用程序中– GCC链接器错误

时间:2018-07-31 13:29:52

标签: linux gcc cmake

在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

1 个答案:

答案 0 :(得分:0)

问题已解决,这要感谢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之前。