问题描述
我是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)