2013-12-11 24 views
5

cmake ile yapı yapılandırması yazıyorum: kendi koduyla ana proje dışında bazı dış kütüphaneler vardır. Bu kütüphanelerin kolay güncellenmesi için (zlib, libpng, ...) cmakelist dosyalarını değiştirmek istemiyorum, ancak belirli kütüphane hedeflerine (örneğin, target_link_libraries() içinde kullanmak için) ihtiyacım var. Diğer bir kısıtlama ise, kodumun harici kütüphanelere yüklenmesi gerektiğini söyleyemem, her şeyin tek bir kod ağacında bulunması ve birlikte oluşturulması gerekiyor. Herşeyi kütüphaneler yapılandırılmış (libs, header) sağlamak için Yerel bina klasörüne (make install does) kitaplıklarını yüklemek istiyorum ve sonra projeye gerekli hedefleri almak için oluşturulan cmake dosyasını dahil etmek istiyorum. aşağıdaki gibiCmake hedef tetikleme yüklemek

Ben akışını varsayalım:

  1. birincil projede
  2. kullanımı ithal hedefleri oluşturulan cmake-dosyasını kullanarak
  3. ithalat hedefleri yerel dizine harici kütüphane dosyaları yüklemek add_subdirectory()
  4. ile dış kütüphane kurmak cmake dosyaları

Sorun adım 2'yi otomatik hale getirmektir (gerek ana proje CMakeLists.txt içinde add_subdiretory sonra install hedef tetikleyin. Tüm kütüphaneleri kurabilir ve kurabilir ve kendi kodunu oluşturabilirim, ancak bu uygun değil.

Yani soru, cmake'nin derleme sırasında ara yükleme yapmasını nasıl söyleyebilirim? Burada

Biraz çalışma örneği:

dosya yapısı:

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 bulunmaktadır.

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

DÜZENLEME: Ana projede istenen cmakelists: cpp

#include <iostream> 
#include "libheader.h" 

int getRandomNumber() 
{ 
    return 4; // guaranteed to be random. 
} 

Hepiniz oluşturmak için aşağıdaki komutu kullanabilirsiniz

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) 
+0

[ExternalProject] (http://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:ExternalProject) modülüne bir göz atın. –

cevap

1

üzgünüm, açıklama

koymak için hiçbir ayrıcalığa sahip

Referans bağlantıyı buraya koydum

projede önceden oluşturulmuş kütüphane ikilileri dahil edilirken

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

bu da yararlıdır.

add_library (önceden oluşturulmuş STATİK İTHAL) set_property (HEDEF önceden oluşturulmuş MÜLKİYET IMPORTED_LOCATION $ {CMAKE_CURRENT_SOURCE_DIR} /libprebuilt.a)

(Hedefler other_built_targets önceden oluşturulmuş İHRACAT proje ihracatı SÜRE HEDEF bin KÜTÜPHANE HEDEF lib ARŞİV yüklemek DESTINATION lib)

İçe aktarılan bir hedefin yapılması, projesinde kullanıma elverişli hale getirir ve başka herhangi bir hedef gibi davranır.