2015-09-09 17 views
5

ben inşa Paylaşılan kitaplık (Ben mesela Fibonacci sayısını hesaplarken bir lib kullanın) kendim ve CMakeNeden CKağıt tasarlanmıştır

tarafından inşa benim başka C++ projesinde kullanmak istiyorum

012: en /path/to/my/lib bulunan paylaşılan kütüphane ve başlıklar, paylaşılan kütüphane libfib.so /path/to/my/lib/lib olduğunu ve başlık fib.h /path/to/my/lib/include olduğunu ve kendi proje İşte benim asıl CMakeLists.txt olduğunu

/path/to/my/project bulunan diyelim

cmake_minimum_required(VERSION 3.2) 
project(learn-lib) 
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") 
set(FIB_INCLUDE "${FIB_PREFIX}/include") 
set(FIB_LIB "${FIB_PREFIX}/lib") 
set(EXE mybin) 
include_directories(${FIB_INCLUDE}) 
link_directories(${FIB_LIB}) 
add_executable(${EXE} main.cpp) 
target_link_libraries(${EXE} fib) 
install(TARGETS ${EXE} RUNTIME DESTINATION bin) 

Ve oluşturmak ve projemi yüklemek için bu komut dosyasını kullanın: çalıştırırken yüklemek Komut dosyasını çalıştırdıktan sonra, Şimdi

mkdir -p build_dir 
cd build_dir 
cmake -DFIB_PREFIX=/path/to/my/lib \ 
     -DCMAKE_INSTALL_PREFIX=/path/to/my/project \ 
     .. 
make 
make install 
cd .. 

, iki yürütülebilir, build_dir tane, Yükleme konumunda path/to/my/project/bin, bir tane var build_dir program, her şey iyi, ama yüklü programı çalıştırırken, alıyorum:

./bin/mybin: hatayı paylaşılan kütüphaneleri yüklenirken: libfib.so: paylaşılan açamazsınız nesne dosyası: böyle bir dosya veya dizin

google ve stackoverflow Bazı arama yaptıktan sonra, ben CMake oluştururken yürütülebilir bağlıdır çalışma zamanı arama yolunu kaldırıldı görünüyor biliyordu. Şimdi etrafında almak için iki yol biliyorum:

  1. libfib.soLD_LIBRARY_PATH
  2. içine set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) ekle değişken ortama bulur kütüphane yolunu ekleyin benim CMakeLists.txt

Yani, sorularım şunlardır:

  1. Neden CMake nasıl tasarlanmıştır? Yüklerken, neden yürütme yürütülebilir dosyaları yükleme hedefine kopyalamak yerine veya yüklü programın bağlantı yolunu saklamak yerine yürütme süresinden yürütme yürütücüsünden neden kaldırılır?
  2. Bu sorunu ortadan kaldırmak için en iyi yöntem hangisidir (ya da en iyi uygulama var mıdır)? Çevreyi ayarlamak veya set_target_properties(...)'u CMakeLists.txt'a eklemek için?
Sen Özellikle Bu alıntı başınıza gelenleri alakalı görünüyor CMake's RPATH handling settings

içine bakmak isteyebilirsiniz

cevap

5

: Herhangi rpath ilgili ayarları değiştirmek yoksa varsayılan olarak

, CKağıt bağlayacak yapı ağacındaki tüm kullanılmış kütüphanelere tam RPATH ile yürütülebilir dosyalar ve paylaşılan kütüphaneler. Yüklerken, bu hedeflerin RPATH'sini temizleyecek ve böylece boş bir RPATH ile yüklenecektir.

Örneğin CMAKE_INSTALL_RPATH değişken kullanılarak yüklenen ikili için ayarlanan rpath ayarlayabilirsiniz

:

SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") 

ve ayrıca yükleme sırasında sıyırma rpath devre dışı bırakabilirsiniz:

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 
+4

ben add_executable ($ {EXE} main.cpp) 'dan sonra 'SET (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)' eklediğimde, cmake çalışma zamanı yolunu keser, 'set_target_properties ($ {EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) ys, CMakeLists.txt'deki konumuna bakmaksızın çalışır. – Alaya