2013-12-17 16 views
5

CMake kullanarak Linux'ta bir C++ projesi geliştiriyorum.CMake - Farklı Hedefler İçin Farklı Dizinleri Dahil Et?

İki kitaplık oluşturuyorum, LibA ve LibB. Ben de dahil olmak üzere LibA ve LibB istemiyorum dizinleri içerir. DirectoryA'u dahil etmek için LibA'u ayarlayabileceğim ve DirectoryB'u dahil etmek için yalnızca LibB'u ayarlayabileceğim herhangi bir yol var mı?

Düzenleme:

Hem LibA

ve LibB bir yürütülebilir, MyExe kullanılacaktır. MyExe kaynak kodunda #includeLibA.h ve LibB.h olduğunda, DirectoryA ve DirectoryB ile birlikte gelen üstbilgi dosyalarına sahip olamaz, bu ad alanı çakışmalarını oluşturacaktır MyExe.

Bu mümkün mü?

Düzenleme 2: İşte benim CMakeLists.txt include_directories (dahil) 'dir

add_library(LibA src/LibA.cpp include/LibA.h) 
set_property(TARGET LibA PROPERTY INCLUDE_DIRECTORIES /opt/SomeLibrary2.0/include/) 
target_link_libraries(LibA /opt/SomeLibrary2.0/lib/a.so /opt/SomeLibrary2.0/lib/b.so /opt/SomeLibrary2.0/lib/c.so) 

add_library(LibB src/LibB.cpp include/LibB.h) 
set_property(TARGET LibB PROPERTY INCLUDE_DIRECTORIES ${LIB_B_INCLUDE_DIRS}) 
target_link_libraries(LibB ${LIB_B_LIBRARIES}) 

add_executable(MyExe src/myexe.cpp) 
target_link_libraries(MyExe LibA LibB) 

Ama hala hatalar alıyorum. LibA.h, SomeLibrary'in başlık dosyalarının bulunamadığını söylüyor?

+2

Bölünmüş CKağıt dosyaları, bunları yapmak alt dizinleri. – IdeaHat

+0

Yorumunuz için teşekkür ederiz. Orijinal sorum, sorunumu daha iyi yansıtmak için güncellendi. – trianta2

+1

'MyExe'de bulunan DirectoryA ve DirectoryB'den gelen üstbilgi dosyalarına sahip olamıyorum, bu ad alanı çakışmaları yaratacağı için IMHO bu tasarım sorunudur, çakışmalar içeriyorsa garip linker hataları ve beklenmedik çalışma zamanı davranışınız olabilir –

cevap

13

CMake sürüm 2.8.12'yi en az olarak belirtebilirseniz, target_include_directories'u kullanabilirsiniz. Bu 2.8.11 sürümünde tanıtıldı, ama 2.8.12'ye kadar biraz buggy olduğunu düşünüyorum.

Yani yapabilirsiniz: Eğer CMake eski sürümlerini destekleyen varsa, uygun hedeflere INCLUDE_DIRECTORIES özelliği ayarlayabilirsiniz

target_include_directories(LibA PRIVATE DirectoryA) 
target_include_directories(LibB PRIVATE DirectoryB) 

:

set_property(TARGET LibA 
      PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryA) 
set_property(TARGET LibB 
      PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryB) 
+0

Cevap. Orijinal sorum, sorunumu daha iyi yansıtmak için güncellendi. – trianta2

+0

Şu anda 2.8.7 kullanıyorum, şu an itibariyle değil. Eğer 2.8.12 problemimi çözecek özelliklere sahipse, CMake'i güncelleyeceğim. – trianta2

+1

Cevabımı lib'leri exes yerine göstermek için güncelledim. CMake'i yükseltmeye gerek yoktur - her iki yöntem de kütüphanelerin içerme dizinlerinin exe'nin direktifleri olmasına neden olmamalıdır. – Fraser