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