cmake添加外部已构建库

dxxyhpgq  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(114)

我想添加一个依赖到一个目标。这个依赖项是一个预编译的库。我希望能够通过在我的CMakeLists.txt中指定像add_dep(libName)这样的名称来获得外部依赖项。add_dep函数应该可重用于不同的库。
我找不到任何方法来做到这一点,only for libs which are compiled during build
how would I pass the target name in a generic form here?
would be fine, but the "consumer" shouldn't have to add inc/lib dirs etc

ax6ht2ek

ax6ht2ek1#

基于Some programmer dude
在外部库CMakeList.txt的目录中:

find_library(lib libName dir/to)
add_library(libName SHARED IMPORTED GLOBAL) # GLOBAL -> if outside src tree
set_property(TARGET libName PROPERTY IMPORTED_LOCATION ${lib})
set_property(TARGET libName APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/include)

在“根”CMakeList.txt中:

add_subdirectory("$ENV{COMMON_ROOT}/libs/libName" "$ENV{COMMON_ROOT}/libs/libName") # usage for out of src ref

target_link_libraries(target libName)添加到需要它的CMakeLists.txt

xtfmy6hx

xtfmy6hx2#

CMake提供了一个关于将依赖项添加到构建中的优秀教程。旧的find_package()用于合并本地构建的依赖项(由CMake或其他构建系统),而相对较新的(自CMake 3.11以来)FetchContent能够下载CMake支持的源代码并在构建文件夹中构建依赖项(更像JavaScript的npm installpackage.json)。
然而,从源代码构建可能很耗时,特别是对于一些大型库,如Boost,您可能希望在诉诸源代码之前首先搜索本地构建的库。好消息是,通过将FetchContentfind_package()FetchContent_Declare()FIND_PACKAGE_ARGS选项集成,您可以两全其美。这允许CMake首先尝试调用find_packge()来满足依赖关系,然后在目标不存在的情况下从源代码构建。如果您想使用OVERRIDE_FIND_PACKAGE选项控制依赖项的版本(或特定提交),也可以强制执行从源代码构建策略。
下面是一个小的示例项目,涵盖了我经常使用的第三方库:Eigenfmt。如果您已经在本地构建了库(例如,通过macOS上的Homebrew),则与使用find_package()一样快。

文件

在一个文件夹中:

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
set(PROJECT_NAME test)
project(${PROJECT_NAME})

# For FetchContent_Declare() and FetchContent_MakeAvailable()
include(FetchContent)

set(CMAKE_CXX_STANDARD 17)

# Eigen
FetchContent_Declare(Eigen
  GIT_REPOSITORY [email protected]:libeigen/eigen.git
  GIT_TAG 3147391d # Release 3.4.0
  FIND_PACKAGE_ARGS NAMES Eigen3
)

# fmt
FetchContent_Declare(fmt
  GIT_REPOSITORY https://github.com/fmtlib/fmt.git
  GIT_TAG f5e5435 # Release 10.1.1
  FIND_PACKAGE_ARGS NAMES fmt
)

FetchContent_MakeAvailable(Eigen fmt)

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} Eigen3::Eigen fmt::fmt)
  • main.cpp
#include <Eigen/Dense>
#include <fmt/core.h>
#include <iostream>

int main() {
  // Eigen
  Eigen::Vector3d coords{1.0, 2.0, 3.0};
  std::cout << "Vec = " << coords << std::endl;
  // fmt
  fmt::print("Hello world and!\n");
}

构建

1.在同一个文件夹中,创建一个build子文件夹:

mkdir build
cd build

1.运行cmake

cmake ..

1.运行make

make

相关问题