2013-12-17 2 views
5

나는 CMake를 사용하여 리눅스에서 C++ 프로젝트를 개발 중이다.CMake - 다른 대상에 대해 다른 디렉토리를 포함 하시겠습니까?

두 라이브러리, LibALibB을 생성 중입니다. 내가 LibALibB 같은 포함 디렉토리를 갖고 싶지 않아요. LibA에만 DirectoryA을 포함하도록 설정하고 LibB에만 DirectoryB을 포함하도록 설정할 수있는 방법이 있습니까?

편집 :

모두 LibA

LibB이 실행, MyExe에 사용됩니다. MyExe의 소스 코드에 #includeLibA.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에 공존시킬 수 없으므로 이름 공간 충돌이 발생합니다. IMHO 설계상의 문제입니다. 충돌을 포함하면 이상한 링커 오류와 예기치 않은 런타임 동작이 발생할 수 있습니다. –

답변

13

CMake 버전 2.8.12를 최소로 지정할 수있는 경우 target_include_directories을 사용할 수 있습니다. 이것은 2.8.11 버전에서 소개되었지만, 2.8.12까지 약간 버그가 있다고 생각합니다.

그래서 당신이 할 수 있습니다 : 당신이 CMake의 이전 버전을 지원해야하는 경우가 적절 대상에서 INCLUDE_DIRECTORIES 속성을 설정할 수 있습니다

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

감사합니다. 대답. 원래 문제는 내 문제를보다 잘 반영하도록 업데이트되었습니다. – trianta2

+0

현재 2.8.7을 사용 중이므로 지금은 아닙니다. 2.8.12에 내 문제를 해결할 기능이 있다면 CMake를 업데이트 할 것입니다. – trianta2

+1

exes가 아닌 libs를 표시하도록 내 대답을 업데이트했습니다. 두 가지 방법 중 하나를 사용하면 라이브러리의 include 디렉토리가 exe의 include 디렉토리가되지 않아야합니다. – Fraser

관련 문제