c++ - 在 cmake 中需要具有依赖项的共享库
问题描述
我是 cmake 的新手,所以我无法弄清楚如何对以下内容进行建模:我的程序需要一个第三方库,我只能以头文件和*.so
文件的形式访问该库。它还将其许多依赖项作为*.so
文件提供。如何确保所有内容都正确编译和链接,理想情况下以“正确”的 cmake 方式?
我试过这个
cmake_minimum_required (VERSION 3.8)
project ("Test")
add_executable (MyApp "MyApp.cpp")
link_directories("/path/to/lib")
target_include_directories(MyApp PUBLIC "/path/to/headers")
这编译但在链接阶段失败。
然后我尝试了
cmake_minimum_required (VERSION 3.8)
project ("Test")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
add_executable (MyApp "MyApp.cpp")
find_package(Library REQUIRED)
target_link_libraries(MyApp PUBLIC Library::Library)
并cmake/FindLibrary.cmake
遵循https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/(截断):
...
if(Library_FOUND AND NOT TARGET Library::Library)
add_library(Library::Library SHARED IMPORTED)
set_target_properties(Library::Library PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${Library_INCLUDE_DIR}"
)
set_target_properties(Library::Library PROPERTIES
IMPORTED_LOCATION "/path/to/library.so"
)
endif()
*.so
这会编译并链接,但在运行时找不到所需的其他文件。我想我还需要以某种方式将它们添加为库,尽管我不希望它们以FindLibrary.cmake
. 我该如何正确地做到这一点?
解决方案
您可以使用IMPORTED
库:
add_library(externalLib SHARED IMPORTED GLOBAL)
set_property(TARGET externalLib PROPERTY IMPORTED_LOCATION "/path/to/lib.so")
target_include_directories(externalLib INTERFACE "/path/to/headers")
target_link_directories(externalLib INTERFACE /path/to/libs)
target_link_libraries(externalLib INTERFACE -ldep1 -ldep2)
然后你可以依赖它:
target_link_libraries(MyApp PRIVATE externalLib)
推荐阅读
- editor - Geany 不打印几个字符组合
- azure - Kusto:make-series 在第一天停止 - 没有按预期工作
- java - 在 mac 上运行 example.app 文件时,通过 java 中的错误 - 异常 java.lang.ClassNotFoundException: org.sqlite.JDBC
- text-to-speech - 生成 mp3 文本转语音文件的 cURL 命令请求是什么?
- php - Jquery:不通过 Ajax 从 php 页面接收数据
- ipython - 无法使用崇高文本运行氦气
- ruby-on-rails - 如何在加载 Rails 环境的情况下调试单个文件
- c++ - FlatBuffers C++ reinterpret_cast 访问实际上是未定义的行为吗?这样做实际上可以吗?
- java - 如何从json文件中一一获取多个json数据?
- ubuntu - 无法打开 FTDI SPI 接口