在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
答案 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之前。