CMake를 사용하여 포함 디렉토리를 올바르게 추가하는 방법
약 1 년 전에 CMake의 헤더 종속성에 대해 물었습니다 .
최근에 CMake가 해당 헤더 파일을 프로젝트 외부 에있는 것으로 간주한다는 문제가 있음을 깨달았습니다 . 적어도 Code :: Blocks 프로젝트를 생성 할 때 헤더 파일은 프로젝트 내에 나타나지 않습니다 (소스 파일은). 따라서 CMake는 해당 헤더를 프로젝트 외부 에있는 것으로 간주 하고 종속 항목에서 추적하지 않습니다.
CMake 튜토리얼의 빠른 검색은 include_directories
내가 원하는 것을하지 않는 것으로 나타났습니다 ...
CMake에 특정 디렉토리에 포함 할 헤더가 포함되어 있고 생성 된 Makefile에서 해당 헤더를 추적해야한다는 신호를 보내는 올바른 방법은 무엇입니까?
두 가지를 수행해야합니다.
먼저 포함 할 디렉토리를 추가하십시오.
target_include_directories(test PRIVATE ${YOUR_DIRECTORY})
을 지원하지 않고 매우 오래된 CMake 버전 (2.8.10 이상)이 붙어있는 경우 target_include_directories
레거시를 include_directories
대신 사용할 수도 있습니다 .
include_directories(${YOUR_DIRECTORY})
그런 다음 헤더 파일을 현재 대상의 소스 파일 목록에 추가해야합니다 (예 :
set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_executable(test ${SOURCES})
이런 식으로 헤더 파일은 Makefile에 종속 항목으로 표시되며 생성 된 Visual Studio 프로젝트 (예 : 생성 된 Visual Studio 프로젝트)에도 표시됩니다.
여러 대상에 해당 헤더 파일을 사용하는 방법 :
set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_library(mylib libsrc.cpp ${HEADER_FILES})
target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY})
add_executable(myexec execfile.cpp ${HEADER_FILES})
target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})
먼저 include_directories()
CMake에게 디렉토리를 -I
컴파일 명령 줄 에 추가 하도록 지시 하는 데 사용 합니다 . 둘째, 당신 add_executable()
이나 add_library()
전화에 헤더를 나열합니다 .
예를 들어 프로젝트 소스가에 있고에서 src
헤더가 필요한 include
경우 다음과 같이 할 수 있습니다.
include_directories(include)
add_executable(MyExec
src/main.c
src/other_source.c
include/header1.h
include/header2.h
)
CMake는 Makefile을 만드는 다른 방법 (예 : make 또는 qmake)과 비교하면 스크립트 언어와 비슷합니다. 파이썬처럼 시원하지는 않지만 여전히 그렇습니다.
사람들이 디렉토리를 포함하는 다양한 오픈 소스 프로젝트를 살펴보면 " 올바른 방법 " 과 같은 것은 없습니다 . 그러나 두 가지 방법이 있습니다.
Crude include_directories 는 현재 프로젝트 및 일련의 add_subdirectory 명령을 통해 추가 할 다른 모든 하위 프로젝트에 디렉토리를 추가 합니다. 때때로 사람들은 그러한 접근법이 레거시라고 말합니다.
보다 우아한 방법은 target_include_directories 입니다. 다양한 포함 디렉토리의 불필요한 상속이나 충돌없이 특정 프로젝트 / 대상에 대한 디렉토리를 추가 할 수 있습니다. 또한 미묘한 구성을 수행하고이 명령에 대해 다음 마커 중 하나를 추가 할 수 있습니다.
PRIVATE- 이 지정된 빌드 대상에만 사용
공개 -지정된 대상 및이 프로젝트와 연결된 대상에 사용하십시오.
인터페이스 -현재 프로젝트와 연결되는 대상에만 사용
추신:
두 명령 모두 디렉토리를 SYSTEM으로 표시하여 지정된 디렉토리에 경고가 포함 된 것은 사용자의 비즈니스가 아님을 암시합니다.
비슷한 대답은 target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS 명령의 다른 쌍입니다.
나는 같은 문제가 있었다.
내 프로젝트 디렉토리는 다음과 같습니다.
--project
---Classes
----Application
-----.h and .c files
----OtherFolders
--main.cpp
그리고 내가 그 모든 폴더에 파일을 포함시키는 데 사용한 것 :
file(GLOB source_files
"*.h"
"*.cpp"
"Classes/*/*.cpp"
"Classes/*/*.h"
)
add_executable(Server ${source_files})
그리고 그것은 완전히 작동했습니다.
추가하십시오 include_directories("/your/path/here")
.
옵션 으로 호출 gcc
하는 것과 비슷합니다 -I/your/path/here/
.
경로를 큰 따옴표로 묶어야합니다. 다른 사람들은 그것을 언급하지 않았고 2 일 동안 나를 고착시켰다. 따라서이 답변은 CMake를 처음 접하고 혼란스러워하는 사람들을위한 것입니다.
참고 URL : https://stackoverflow.com/questions/13703647/how-to-properly-add-include-directories-with-cmake
'Programming' 카테고리의 다른 글
자식은 파일을 어떻게 저장합니까? (0) | 2020.05.09 |
---|---|
go get으로 설치된 패키지 제거 (0) | 2020.05.09 |
클래스의 함수 선언 후 "default"는 무엇을 의미합니까? (0) | 2020.05.09 |
가상 함수와 순수한 가상 함수의 차이점 (0) | 2020.05.09 |
빌드를 실행할 때 IntelliJ 절단 출력을 중지하는 방법은 무엇입니까? (0) | 2020.05.09 |