gpt4 book ai didi

linux - 使用 CMake 将共享库包含到 Linux 应用程序中——GCC 链接器错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:07 25 4
gpt4 key购买 nike

我在 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 相关的链接器错误吗?

更新:

用户名要求我使用 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

最佳答案

感谢 n.m. 的评论,问题解决了。多于。因为我没有包括 libfbclient,所以我得到了“对‘isc_create_database’的 undefined reference ,以及其他‘isc_...’消息。

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

这是一个简化的、非常准系统的 CMakeLists.txt,它演示了将 IBPP.a 实现到您的应用程序中所需的条件,而无需将 IBPP 源代码包含到您的应用程序中:

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

注意顺序,libibpp必须在libfbclient之前。

关于linux - 使用 CMake 将共享库包含到 Linux 应用程序中——GCC 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51614600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com