Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake安装目标触发_Cmake - Fatal编程技术网

Cmake安装目标触发

Cmake安装目标触发,cmake,Cmake,我正在用cmake编写构建配置:除了带有自己代码的主项目外,还有一些外部库。为了方便更新这些库(zlib、libpng等),我不想修改它的cmakelists文件,但我需要特定的库目标(例如在target_link_libraries()中使用)。 另一个限制是,我不能只说我的代码需要安装外部库,所有东西都必须位于一个源代码树中,并且必须一起构建。 为了使库提供的所有内容保持结构化(libs、headers),我想将库(如makeinstalldoes)安装到本地建筑文件夹中,然后包括生成的cm

我正在用cmake编写构建配置:除了带有自己代码的主项目外,还有一些外部库。为了方便更新这些库(zlib、libpng等),我不想修改它的cmakelists文件,但我需要特定的库目标(例如在target_link_libraries()中使用)。 另一个限制是,我不能只说我的代码需要安装外部库,所有东西都必须位于一个源代码树中,并且必须一起构建。 为了使库提供的所有内容保持结构化(libs、headers),我想将库(如
makeinstall
does)安装到本地建筑文件夹中,然后包括生成的cmake文件,以便将所需的目标导入到我的项目中

我认为流程如下:

  • 使用
    add_子目录()
  • 将外部库文件安装到本地目录
  • 使用生成的cmake文件导入目标
  • 在主项目cmake文件中使用导入的目标
  • 问题是自动执行步骤2(需要在主项目CMakeLists.txt中的
    add_subdirectory
    之后触发
    install
    target)。我可以构建和安装所有库,然后构建自己的代码,但这并不方便

    所以问题是,我如何告诉cmake在构建期间进行中间安装

    这里有一个小的工作示例:

    文件结构:

    prj/CMakeLists.txt
    prj/src/main.cpp
    lib/CMakeLists.txt
    lib/include/libheader.h
    lib/src/libsource.cpp
    
    prj/CMakeLists.txt

    项目(TestProject)
    cmake_最低要求(2.8版)
    设置(CMAKE_VERBOSE_MAKEFILE on)
    集合(工作目录${CMAKE\u当前目录$\u源目录})
    #这里应该使用add_子目录(强制安装)。
    #然后包含预先指定的包含文件,如下所示。
    include_目录(${WORK_DIR}/./lib/build/install/include)
    包括(${WORK\u DIR}/./lib/build/install/lib/lib/libtargets.cmake)
    添加可执行文件(main${WORK\u DIR}/src/main.cpp)
    目标链接库(主库目标)
    
    lib/CMakeLists.txt

    项目(TestLib)
    cmake_最低要求(2.8版)
    设置(CMAKE_VERBOSE_MAKEFILE on)
    集合(工作目录${CMAKE\u当前目录$\u源目录})
    包含目录(${WORK\u DIR}/include)
    添加库(库目标静态${WORK\u DIR}/src/libsource.cpp)
    设置(CMAKE\u安装\u前缀${CMAKE\u当前\u二进制\u目录}/INSTALL)
    安装(文件${WORK\u DIR}/include/libheader.h DESTINATION include)
    安装(目标库\目标目标库导出libtargets)
    安装(导出libtargets目标库)
    
    prj/src/main.cpp

    #包括
    #包括“libheader.h”
    使用std::cout;
    int main()
    {
    
    对不起,我无权发表评论

    所以,我把参考链接放在这里

    在中包含预构建的库二进制文件时,这也很有用 项目

    添加_库(预构建静态导入)设置_属性(目标预构建 属性导入(位置${CMAKE\u CURRENT\u SOURCE\u DIR}/libprebuild.a)

    安装(目标为其他\u已构建\u预构建目标 导出项目导出 运行时目标箱 库目标库 存档目标库)

    使预构建的导入目标便于在 项目,并将其与任何其他目标一样进一步处理

    看一看模块