Cmake安装目标触发

时间:2013-12-11 19:58:21

标签: cmake

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

我想流程如下:

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

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

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

    文件结构:

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

    PRJ /的CMakeLists.txt

    project(TestProject)
    cmake_minimum_required(VERSION 2.8)
    set(CMAKE_VERBOSE_MAKEFILE on)
    set(WORK_DIR ${CMAKE_CURRENT_SOURCE_DIR})
    # supposed to use add_subdirectory here (with forced install).
    # and then include prespecified include-file as here.
    include_directories(${WORK_DIR}/../lib/build/install/include)
    include(${WORK_DIR}/../lib/build/install/lib/libtargets.cmake)
    add_executable(main ${WORK_DIR}/src/main.cpp)
    target_link_libraries(main library_target)
    

    LIB /的CMakeLists.txt

    project(TestLib)
    cmake_minimum_required(VERSION 2.8)
    set(CMAKE_VERBOSE_MAKEFILE on)
    set(WORK_DIR ${CMAKE_CURRENT_SOURCE_DIR})
    include_directories(${WORK_DIR}/include)
    add_library(library_target STATIC ${WORK_DIR}/src/libsource.cpp)
    set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)
    install(FILES ${WORK_DIR}/include/libheader.h DESTINATION include)
    install(TARGETS library_target DESTINATION lib EXPORT libtargets)
    install(EXPORT libtargets DESTINATION lib)
    

    PRJ / SRC / main.cpp中

    #include <iostream>
    #include "libheader.h"
    
    using std::cout;
    
    int main()
    {
        cout << getRandomNumber() << "\n";
        return 0;
    }
    

    LIB /包含/ libheader.h

    #ifndef _LIBHEADER_H_
    #define _LIBHEADER_H_
    
    int getRandomNumber();
    
    #endif
    

    LIB / SRC / libsource.cpp

    #include <iostream>
    #include "libheader.h"
    
    int getRandomNumber()
    {
        return 4; // guaranteed to be random.
    }
    

    您可以使用以下命令构建所有:

    pushd . && mkdir lib/build && cd lib/build && cmake .. && make && make install && popd && pushd . && mkdir prj/build && cd prj/build && cmake .. && make || popd
    

    编辑:主要项目中所需的cmakelists:

    set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)
    add_subdirectory(${WORK_DIR}/../lib ${CMAKE_CURRENT_BINARY_DIR}/lib.d)
    # force install here, somehow
    # because if not we will get "include could not find load file" here.
    include(${CMAKE_CURRENT_BINARY_DIR}/install/lib/libtargets.cmake)
    include_directories(${CMAKE_CURRENT_BINARY_DIR}/install/include)
    

1 个答案:

答案 0 :(得分:1)

抱歉,我没有权利发表评论

所以,我把引用链接放在这里

https://cmake.org/Bug/view.php?id=14311

  

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

     

add_library(预建STATIC IMPORTED)set_property(TARGET预建)   PROPERTY IMPORTED_LOCATION $ {CMAKE_CURRENT_SOURCE_DIR} /libprebuilt.a)

     

安装(TARGETS other_built_targets预建       EXPORT项目 - 出口       RUNTIME DESTINATION垃圾箱       LIBRARY DESTINATION lib       ARCHIVE DESTINATION lib)

     

预先构建一个导入的目标,方便使用   投射并像其他任何目标一样对待它。