2016-08-08 2 views
11

는 메이크업의 CMakeLists.txt에서 니펫 : 이제이적 target_include_directories 여기

add_library(foo-object OBJECT src/foo.cpp) 
target_include_directories(foo-object PUBLIC include) 
add_library(foo SHARED $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 
add_library(foo_static STATIC $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 

,이 모든 작품을 잘, 두 라이브러리가 생성됩니다. 내가 그것을 사용하려고하면 그러나 나는 문제가있다 :

add_executable(bar src/main.cpp) 
target_link_libraries(bar foo) 

대상 bar이 컴파일되지 않습니다, foo는 객체에서 디렉토리를 포함하기 때문에 전파되지 않습니다. 만약 내가에 직접 추가하면 foo, 모든 것이 잘 컴파일됩니다.

foofoo_static은 모두 foo-object의 디렉토리를 자동으로 사용하고 (이에 따라 처리 할 수 ​​있습니다) 어떻게 할 수 있습니까?

+0

좋은 제목 - 쉽게 찾을 수있는 어려운 질문을했습니다. – CJxD

답변

3

흠, 내가 해낸 순간에 다음

add_library(foo-object OBJECT src/foo.cpp) 
target_include_directories(foo-object PUBLIC include) 

get_property(object_include_dirs TARGET foo-object PROPERTY INCLUDE_DIRECTORIES) 
get_property(object_link_libs TARGET foo-object PROPERTY LINK_LIBRARIES) 

add_library(foo SHARED $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 
target_include_directories(foo PUBLIC ${object_include_dirs}) 
target_link_libraries(foo PUBLIC ${object_link_libs}) 

add_library(foo_static STATIC $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 
target_include_directories(foo_static PUBLIC ${object_include_dirs}) 
target_link_libraries(foo_static PUBLIC ${object_link_libs}) 

하지만 더 나은 방법이 있어야합니다, 어서 : 표적이를 통해 링크되는 때 전이 속성에만 작동 보인다/

+0

'target_link_libraries (foo PUBLIC foo-object)'로 충분하지 않습니까? – wasthishelpful

+0

나는 그것을 시도 할 것이다, 나는 그것이 아마도 작동해야한다고 생각 하느냐? 감사합니다. D – Paladin

+0

@wasthishelpful : 좋은 생각이지만 작동하지 않음 : "OBJECT_LIBRARY 유형의 대상"foo-object "는 다른 대상에 링크되어 있지 않을 수 있습니다. 하나는 STATIC 또는 SHARED 라이브러리에만 링크 될 수 있습니다 , 또는 ENABLE_EXPORTS 속성이 설정된 실행 파일에. " – Paladin

1

target_link_library 호출 체인. 귀하의 경우에는 foo-objectfoo 사이에 그런 연결 고리가 없습니다.

foo에 소스 파일을 추가하는 경우 해당 파일도 foo-object의 포함 디렉토리를 볼 수 없어야합니다.

OBJECT 라이브러리의 디자인에서 이것은 과도기적 속성을 근본적으로 상실하기 때문에 가능합니다.