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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...