ben inşa Paylaşılan kitaplık (Ben mesela Fibonacci sayısını hesaplarken bir lib kullanın) kendim ve CMake
Neden 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:
google ve stackoverflow Bazı arama yaptıktan sonra, ben./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
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:
libfib.so
LD_LIBRARY_PATH
- içine
set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
ekle değişken ortama bulur kütüphane yolunu ekleyin benimCMakeLists.txt
Yani, sorularım şunlardır:
- 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? - 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(...)
'uCMakeLists.txt
'a eklemek için?
içine bakmak isteyebilirsiniz
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