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

问题描述 投票:0回答:2

我正在构建和分发一个可执行文件,它依赖于几个第三方库,其中大部分是在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命令执行此操作?

cmake build-system
2个回答
0
投票

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

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

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

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

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


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
)
© www.soinside.com 2019 - 2024. All rights reserved.