2017-09-19 1 views
0

내 프로젝트에 두 개의 유틸리티 라이브러리가 있습니다. 나는 라이브러리를위한 CMake 설정을 작성하는 가장 좋은 방법을 찾고있다.CMake에 라이브러리가있는 헤더 포함

/my_project 
--> CMakeLists.txt 
--> main.cpp 
--> /utils 
     --> CMakeLists.txt 
     --> common.h 
     --> /base_c 
      --> CMakeLists.txt 
      --> base_c.c 
      --> base_c.h 
     --> /base_cpp 
      --> CMakeLists.txt 
      --> base_cpp.cpp 
      --> base_cpp.hpp 

나의 현재 CMake 파일 :

/my_project/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8) 
project(my_project) 

add_subdirectory(utils) 

add_executable(main main.c) 
target_link_libraries(main utils base_c base_cpp) 

/my_project/utils/CMakeLists.txt

add_subdirectory(base_c) 
add_subdirectory(base_cpp) 

add_library(utils) 
target_sources(utils PUBLIC common.h) 

/my_project/유틸/base_c /CMakeLists.txt

add_library(base_c base_c.c) 
target_sources(base_c PUBLIC base_c.h) 

/my_project/utils/base_cpp/CMakeLists.txt

add_library(base_cpp base_cpp.cpp) 
target_sources(base_cpp PUBLIC base_cpp.hpp) 

find_library(BASEC base_c ../base_c) 
target_link_libraries(base_cpp BASEC) 

문제는 base_cpp 찾을 수없는이 base_c에서 포함되어 있다는 것입니다. 구성을 어떻게 수정해야합니까?

나는 target_include_directories(base_cpp PRIVATE ../base_c)과 작동하도록 만들었지 만보기 흉한 것이므로 필요하지 않아야합니다 (INTERFACE_INCLUDE_DIRECTORIES documentation).

+0

? 'include_directories' 나'target_include_directories'없이 하나의 라이브러리라도 어떻게 컴파일했는지 궁금합니다. – Tsyvarev

+0

@Tsyvarev 나는 이것에 완전히 틀릴지도 모른다. 라이브러리의'INTERFACE_INCLUDE_DIRECTORIES'를 어떻게 사용할 수 있는지 설명해 주시겠습니까? – voddan

+0

CMake 후에 어떤 빌드 시스템을 사용합니까? 메이크 파일? Visual Studio 프로젝트? 디렉토리가 실제로 포함 디렉토리로 전달되는 파일을 조사 할 수 있습니까? – Anedar

답변

0

이 상황을 해결하려면 target_include_directoriesPUBLIC 또는 INTERFACE 옵션이 라이브러리 CMakeLists.txt에 필요합니다. 그러면 INTERFACE_INCLUDE_DIRECTORIES이 (가) target_link_libraries에 의해 사용되는 라이브러리 대상으로 채워집니다.

내 작업 구성 :

/my_project/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8) 
project(my_project) 

add_subdirectory(utils) 

add_executable(main main.c) 
target_link_libraries(main utils base_c base_cpp) 

/my_project/utils/CMakeLists.txt

add_subdirectory(base_c) 
add_subdirectory(base_cpp) 

add_library(utils) 
target_sources(utils PUBLIC common.h) 
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) 

/my_project/유틸/base_c/CMakeLists.TXT

add_library(base_c base_c.c) 
target_sources(base_c PUBLIC base_c.h) 
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) 

/my_project/utils/base_cpp/CMakeLists.txt

add_library(base_cpp base_cpp.cpp) 
target_sources(base_cpp PUBLIC base_cpp.hpp) 
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) 

target_link_libraries(base_cpp base_c) 
INTERFACE_INCLUDE_DIRECTORIES에 대한 문서는`target_include_directories`이 필요하지 않은 것을 의미하는 방법
1

target_include_directories)은 찾고있는 것이지만 PRIVATE 옵션은 아닙니다.

PRIVATE 옵션은 그 대상에 사용되는 디렉토리에있는 target_include_directories() documentation에 따르면, INTERFACE에만 의존 목표에 의해 사용되는 디렉토리에 있으며 PUBLIC 모두를위한 것입니다. 나는에 사용하는 것이 좋습니다

/my_project/utils/base_c/CMakeLists.txt

target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR}) 

는 "링크"는 그것이 속한과에 의존하는 모든 대상은 자동으로 디렉토리를 포함 타겟 디렉토리를 포함이 방법을 .

또한 공용 헤더를 자신의 하위 폴더 /my_project/utils/base_c/base_c/으로 이동 한 다음 #include "base_c/base_c.h"으로 포함 할 수 있습니다. 이로 인해 헤더에 "네임 스페이스"가 생겨 서로 다른 프로젝트의 동일한 이름을 가진 헤더가 모호 해지지 않게되었습니다.

+0

'base_cpp '에서 소비 측면에서 어떤 작업을해야합니까? 현재'find_library'는'BASEC-NOTFOUND'를 리턴합니다. – voddan

+1

같은 프로젝트에서 find_library가 필요 없습니다. 'target_link_libraries (base_cpp base_c)'를 사용하십시오. – Anedar

+0

그래, 그랬지 만 헤더를 해결할 수 없습니다. 아마'target_include_directories (base_cpp )'이 필요할까요? – voddan