链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目
Posted
技术标签:
【中文标题】链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目【英文标题】:CMake project linking Yaml-cpp and Armadillo shared libraries 【发布时间】:2017-11-24 11:46:39 【问题描述】:我正在使用 Linux(飞跃 42.3)。我想编写一个 CMakeList.txt 文件,该文件创建包含我的代码的共享库以及 yaml-cpp 和犰狳库,以便在另一个代码中使用它。所以:
是先从各自的包和 CMakeList.txt 文件中分别编译和安装 Yaml-cpp 和 Armadillo,还是从我的 CMake 项目中一起构建和编译所有内容?目前我采用第二种方式,但如果我使用 nm 或 ldd,我的库无法很好地链接 yaml 或犰狳。
我的项目结构如下:
在“上层”我有:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(myproject CXX)
set(CMAKE_INSTALL_PREFIX "../install" CACHE STRING
"Install path prefix, prepended onto install directories." FORCE)
mark_as_advanced(CMAKE_INSTALL_PREFIX)
set (CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -I all my include files ")
include_directories(
$CMAKE_CURRENT_SOURCE_DIR/all my src file directories)
add_subdirectory(src)
set(CMAKE_MODULE_PATH $CMAKE_MODULE_PATH "$CMAKE_SOURCE_DIR/cmake")
find_package(Yaml REQUIRED)
add_library(Yaml INTERFACE IMPORTED)
set_property(TARGET Yaml PROPERTY
INTERFACE_INCLUDE_DIRECTORIES $YAML_INCLUDE_DIR)
include_directories($YAML_INCLUDE_DIRS)
find_package(BlasLapack)
find_package(Armadillo REQUIRED)
add_library(Armadillo INTERFACE IMPORTED)
set_property(TARGET Armadillo PROPERTY
INTERFACE_INCLUDE_DIRECTORIES $ARMADILLO_INCLUDE_DIR)
include_directories($ARMADILLO_INCLUDE_DIRS)
在“中层”我有:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
function (add_sources target)
get_property(prop_defined GLOBAL PROPERTY $target_SRCS DEFINED)
if(NOT prop_defined)
define_property(GLOBAL PROPERTY $target_SRCS
BRIEF_DOCS "Sources for the $target target"
FULL_DOCS "List of source files for the $target target")
endif()
set(SRCS)
foreach(src IN LISTS ARGN)
if(NOT IS_ABSOLUTE "$src")
get_filename_component(src "$src" ABSOLUTE)
endif()
list(APPEND SRCS "$src")
endforeach()
set_property(GLOBAL APPEND PROPERTY "$target_SRCS" "$SRCS")
endfunction()
add_subdirectory(all my src directories)
get_property(myproject_SRCS GLOBAL PROPERTY myproject_SRCS)
add_library(myproject SHARED $myproject_SRCS)
install(TARGETS myproject DESTINATION lib)
最后在“内在层次”我有:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
add_sources(myproject
mysource.cpp)
install(FILES mysource.hpp DESTINATION include/myproject)
那么,缺少什么?如何将 Yaml-cpp 和 Armadillo 共享库合并到我的库中?谢谢。
【问题讨论】:
【参考方案1】:通常,CMake 查找命令(如 find_package(Yaml REQUIRED)
)会设置变量(如 YAML_LIBRARIES
)。详情见源码FindYAML.cmake
。
要与 YAML 共享库链接,请使用此变量:
target_link_libraries(myproject $YAML_LIBRARIES)
【讨论】:
【参考方案2】:最好使用柯南www.conan.io,C++开发者应该开始使用包管理器。然后你可以在你的 conanfile.txt 中定义
[requires]
armadillo/7.950.1@*****/stable
yaml-cpp/0.5.3@moonforged/stable
[generators]
cmake
犰狳包目前不在柯南存储库中,我有它自己的版本,尚未发布
【讨论】:
以上是关于链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目的主要内容,如果未能解决你的问题,请参考以下文章
未定义的参考链接 yaml-cpp 程序与 mingw-w64 + cmake
链接器错误、Xcode 5 和 Armadillo:“找不到 -larmadillo.4.0.2 的库”