如何使用CMake分发/安装第三方库?

时间:2014-12-17 16:04:27

标签: cmake build-system

我正在构建和分发一个可执行文件,它依赖于几个第三方库,其中大部分是在CMake的构建系统之外构建的(但是,如果有帮助,我可以添加并构建它们为我的CMake文件中的自定义目标。)

以下是我如何包含libs:

target_link_libraries(MyApp
                      Lib1_x64
                      Lib2_x64
                      etc.}

我想要包含一个CMake指令,它可以安装我的可执行文件及其依赖项。除了为每个依赖项调用install命令之外,还有更好的方法吗?

install(DIRECTORY ${DEV_PATH}/Release/ DESTINATION lib FILES_MATCHING PATTERN "libLib1*" PATTERN "*.svn" EXCLUDE PATTERN "*-obj" EXCLUDE)

是否可以通过 add_library 命令执行此操作?

2 个答案:

答案 0 :(得分:0)

抱歉,没有。 add_library命令用于在makefile中创建目标以构建库。 target_link_dependencies只是将各种-L ... -l ...标志传递给目标编译器。

正常的CMake方法是测试您所依赖的其他库或可执行文件是否存在,如果它们不可用则会失败。

处理依赖关系通常留给包管理,例如apt,rpm等。由于多种原因,将依赖组件构建为自己的makefile的一部分是不明智的:

  • 您的客户可能希望使用略有不同的版本
  • 这些依赖项构建方式的任何变化都需要您修改自己的构建脚本
  • 您的程序可以使用多个版本的依赖项,所有这些版本都以不同的方式构建。

作为使用CMake构建整个嵌入式Linux发行版的大部分内容的人(请参阅Open webOS),我建议您将脚本专注于构建一件事。

答案 1 :(得分:0)

我今天也在寻找解决这个问题的方法。

我发现:

include(ExternalProject)
ExternalProject_Add()

做到了!

这是我的示例CMakeLists.txt:

cmake_minimum_required(VERSION 3.13)
project(third-party-build)
include(ExternalProject)
ExternalProject_Add(libuuid
    PREFIX libuuid-prefix
    # DOWNLOAD_DIR libuuid-download
    # SOURCE_DIR libuuid-source
    # DOWNLOAD_COMMAND wget xxx.com/xxx.tar.gz && tar zxf xxx.tar.gz
    DOWNLOAD_COMMAND tar zxf ${PROJECT_SOURCE_DIR}/libuuid-1.0.3.tar.gz
    CONFIGURE_COMMAND <DOWNLOAD_DIR>/libuuid-1.0.3/configure
    BUILD_COMMAND ${MAKE}
    BUILD_IN_SOURCE 1
    INSTALL_COMMAND mkdir -p ${PROJECT_SOURCE_DIR}/lib/ && cp <SOURCE_DIR>/.libs/libuuid.a <SOURCE_DIR>/.libs/libuuid.so <SOURCE_DIR>/.libs/libuuid.so.1 <SOURCE_DIR>/.libs/libuuid.so.1.0.0 ${PROJECT_SOURCE_DIR}/lib/
    LOG_DOWNLOAD 1
    LOG_BUILD 1
    # LOG_INSTALL 1
)