Programming

CMake를 사용하여 포함 디렉토리를 올바르게 추가하는 방법

procodes 2020. 5. 9. 10:35
반응형

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)과 비교하면 스크립트 언어와 비슷합니다. 파이썬처럼 시원하지는 않지만 여전히 그렇습니다.

사람들이 디렉토리를 포함하는 다양한 오픈 소스 프로젝트를 살펴보면 " 올바른 방법 " 과 같은 것은 없습니다 . 그러나 두 가지 방법이 있습니다.

  1. Crude include_directories 는 현재 프로젝트 및 일련의 add_subdirectory 명령을 통해 추가 할 다른 모든 하위 프로젝트에 디렉토리를 추가 합니다. 때때로 사람들은 그러한 접근법이 레거시라고 말합니다.

  2. 보다 우아한 방법은 target_include_directories 입니다. 다양한 포함 디렉토리의 불필요한 상속이나 충돌없이 특정 프로젝트 / 대상에 대한 디렉토리를 추가 할 수 있습니다. 또한 미묘한 구성을 수행하고이 명령에 대해 다음 마커 중 하나를 추가 할 수 있습니다.

PRIVATE- 이 지정된 빌드 대상에만 사용

공개 -지정된 대상 및이 프로젝트와 연결된 대상에 사용하십시오.

인터페이스 -현재 프로젝트와 연결되는 대상에만 사용

추신:

  1. 두 명령 모두 디렉토리를 SYSTEM으로 표시하여 지정된 디렉토리에 경고가 포함 된 것은 사용자의 비즈니스가 아님을 암시합니다.

  2. 비슷한 대답은 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

반응형