2013-12-17 103 views
5

我正在使用CMake在Linux中開發C++項目。CMake - 針對不同目標的不同包含目錄?

我正在創建兩個庫,LibALibB。我不想要LibALibB具有相同的包含目錄。有沒有什麼辦法可以設置只有LibA包括DirectoryA並且只設置LibB包含DirectoryB

編輯:

兩個LibALibB將在可執行文件,MyExe使用。當我在MyExe的源代碼中使用#includeLibA.hLibB.h時,我無法從DirectoryADirectoryB共存於MyExe中包含的頭文件,因爲這會導致命名空間衝突。

這可能嗎?

編輯2:這是我的CMakeLists.txt include_directories(包括)

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) 

但我仍然得到錯誤。 LibA.h說SomeLibrary的頭文件找不到?

+2

斯普利特CMake的文件中,使他們子目錄。 – IdeaHat

+0

感謝您的評論。我原來的問題已更新,以更好地反映我的問題。 – trianta2

+1

'我不能從DirectoryA和DirectoryB共存在MyExe包含的頭文件,因爲這將創建名稱空間衝突'恕我直言,這是設計問題,如果你解決包括衝突你可能有奇怪的鏈接器錯誤和意外的運行時行爲 – 2013-12-17 21:07:23

回答

13

如果您可以指定CMake版本2.8.12爲最小值,則可以使用target_include_directories。這是在2.8.11版中引入的,但是我認爲直到2.8.12纔有點兒錯誤。

所以,你可以這樣做:

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

如果您有支持老版本的CMake,你可以設置適當的目標INCLUDE_DIRECTORIES屬性:

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

謝謝你的回答。我原來的問題已更新,以更好地反映我的問題。 – trianta2

+0

我目前使用2.8.7,所以不是現在。如果2.8.12有能夠解決我的問題的功能,那麼我會更新CMake。 – trianta2

+1

我更新了我的答案,以顯示libs而不是exes。應該沒有必要升級CMake - 使用任何一種方法都不應該導致庫的包含目錄變爲包含exe的dirs。 – Fraser