CMake C ++包含静态系统库以进行项目开发-如何

问题描述

我是C ++和CMake项目的新手。我用CLion编写了使用MysqL连接器的非常简单的应用程序。 这需要安装在系统multipartfile上。在我构建它的系统上这没问题,但是如果我想在其他系统上执行它,则会失败,因为它需要共享库。 我想将该库包含到我的项目中。 为此,我在项目中创建了文件libMysqLcppconn-dev,并复制了文件

lib/static

在安装dev库之后,这些文件位于:

$ tree lib/static
lib/static
├── libMysqLcppconn.a
└── libMysqLcppconn-static.a

现在添加到我的 CMalke.lists 中:

/usr/lib/x86_64-linux-gnu/libMysqLcppconn-static.a
/usr/lib/x86_64-linux-gnu/libMysqLcppconn.a
/usr/lib/x86_64-linux-gnu/libMysqLcppconn.so

但这不会编译

#find_library(MysqLCPP MysqLcppconn-static lib/static/)

add_library(MysqLCPP STATIC IMPORTED)
set_property(TARGET MysqLCPP PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/static/libMysqLcppconn-static.a)

link_directories(lib/static)

target_link_libraries(${project_name} oatpp pthread curl ${MysqLCPP})

如果我取消对[100%] Linking CXX executable ../dist/bin/smsapiclient /usr/bin/ld: CMakeFiles/smsapiclient.dir/src/App.cpp.o: in function `MyController::rootPOST(oatpp::data::mapping::type::String const&)': /home/marcin/projects/smsapiclient/src/controller/MyController.hpp:61: undefined reference to `get_driver_instance' collect2: error: ld returned 1 exit status 函数的注释并对find_library()进行注释,则会出现该错误

add_library() set_property()

所有内容都可以与共享系统库一起使用,但我想将其添加到可执行文件中,以免在其他系统上受到干扰。

如何将静态库正确地包含到我的项目中? 谢谢您的帮助。

在使用系统的库构建ii之后,ldd显示

[ 98%] Linking CXX executable ../dist/bin/smsapiclient
/usr/bin/ld: /home/marcin/projects/smsapiclient/lib/static/libMysqLcppconn-static.a(MysqL_client_api.cpp.o): in function `sql::MysqL::NativeAPI::LibMysqLStaticProxy::options(MysqL*,MysqL_option,void const*)':
(.text+0x4c4): undefined reference to `MysqL_options'

解决方法

这解决了我的问题

target_link_libraries(${project_name} pthread oatpp curl mysqlcppconn-static.a mysqlclient.a ssh.a ssl.a crypto.a dl m.a z.a curl-gnutls.a resolv.a stdc++.a)