2016-03-23 30 views
1

ihraç etmeden statik iç kütüphaneye bağlamak bu yapıyla bir projesi var:CKağıt: Ona

/path/to/my/project 
├── CMakeLists.txt 
├── internal-libs 
│ ├── internal-lib1 
├── libs 
│ ├── lib1 
│ ├── lib2 

lib1 statik bir kütüphanedir.

lib2 statik bir kütüphanedir.

internal-lib1 statik bir kütüphanedir. lib2, lib2 ve internal-lib1 dizinlerini bağlar. lib1 ve lib2 gönderilecek, ancak internal-lib1 geride bırakılacak. bağlantı için, ben var:

target_link_libraries(lib2 PRIVATE internal-lib1) 
target_link_libraries(lib2 PRIVATE lib1) 

Benim anlayış ben, statik ve özel bağlama çünkü iç-Lib1 ilgili tüm bilgiler lib2 içerdiği olacağını ve ben iç-Lib1 ihraç etmeye olmayacağını dış dünyaya.

Bir istemci programında kullanmaya çalıştığınızda

Ancak, ben hata alıyorum : my oluşturulan İhracat yapılandırma dosyasında

/usr/bin/ld cannot find -llib-internal1 
collect2: error: ld returned 1 exit status 

, ben:

# Create imported target lib2 
add_library(lib2 STATIC IMPORTED) 
set_target_properties(lib2 PROPERTIES 
INTERFACE_LINK_LIBRARIES "$<LINK_ONLY:lib1>;**$<LINK_ONLY:internal-lib1>**" 
) 
# Create imported target lib1 
add_library(lib1 STATIC IMPORTED) 

Ben yanlış anlama muyum statik bağlantı mı yoksa kurulumumda bir sorun mu var? Ben cmake 3.2.2 kullanıyorum. Bütün hedeflerim ÖZEL. Neden INTERFACE_LINK_LIBRARIES girişleri ve LINK_ONLY ne anlama geldiğini anlamıyorum.

p.s. Aslında lib1 ve lib2'nin paylaşımlı kütüphaneler olduğu düşünülüyordu, ancak statik sürümün basit bir şekilde çalışmasını sağlayamıyorum bile, burada açığa çıkarılabilen kütüphaneler için statik durumu açıklarım.

cevap

3

target_link_libraries(lib2 PRIVATE lib1) 

kütüphane lib1 bağlama üzerine kütüphaneye lib2 kopyalanır anlamına gelmez CKağıt komut. PRIVATE anahtar sözcüğü, 'a başka bir kitaplık bağlandığında lib1 kitaplığının transitive usage requirements kitaplığını etkiler.

, CKağıt bağlama üzerine lib2 içine lib1 birleştirme sahip libtool kullanabilir ve POST_BUILD eylem için: Bu durumda

add_custom_command(TARGET lib2 POST_BUILD 
    COMMAND /usr/bin/libtool -static -o $<TARGET_FILE:lib2> 
    $<TARGET_FILE:lib2> $<TARGET_FILE:lib1> 

, target_link_libraries ile lib2 için lib1 bağlamak için gerek yoktur.

+0

Teşekkür ederim. Basitçe statik kütüphaneler için kendi yöntemlerini düşündüğüm ama gereksiz yere karmaşık olduğunu düşündüğüm için burada [http://stackoverflow.com/a/11448878/4376555] denedim. Ancak, çözümünüzün daha da zor olduğunu düşünüyorum. – ShS

İlgili konular