簡體   English   中英

Cmake安裝目標觸發

[英]Cmake install target triggering

我正在用cmake編寫構建配置:除了帶有自己代碼的主項目外,還有一些外部庫。 為了方便更新這些庫(zlib,libpng,...),我不想修改其cmakelists文件,但我需要特定的庫目標(例如在target_link_libraries()中使用)。 另一個限制是,我不能只說我的代碼需要安裝外部庫,所有東西必須位於一個源代碼樹中,並且必須一起構建。 為了保持所有庫提供結構化(庫,頭)我想安裝(如make install )庫到本地構建文件夾,然后包含生成的cmake文件以將所需目標導入到我的項目中。

我想流程如下:

  1. 使用add_subdirectory()構建外部庫
  2. 將外部庫文件安裝到本地目錄中
  3. 使用生成的cmake文件導入目標
  4. 在主項目cmake文件中使用導入的目標

問題是自動化第2步(需要在主項目CMakeLists.txt中的add_subdiretory之后觸發install目標)。 我可以構建和安裝所有庫,然后構建自己的代碼,但這不方便。

所以問題是如何告訴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)

對不起,我沒有權利發表評論

所以,我把參考鏈接放在這里

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

在項目中包含預構建的庫二進制文件時,這也很有用。

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

安裝(TARGETS other_built_targets prebuilt EXPORT項目 - 導出RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

預先構建一個導入的目標可以方便地在項目中使用,並像其他任何目標一樣對待它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM