链接 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 的库”

yaml-cpp:链接失败

使用 yaml-cpp 0.5 DLL 时的链接器错误

CMake - 链接器错误与静态yaml-cpp作为git子模块

将 armadillo/blas/lapack 与 cmake 链接(未定义对 `dgemv_' 的引用)