CMake 출력을 'bin'디렉토리로 만들려면 어떻게합니까?


187

현재 플러그인 구조로 프로젝트를 만들고 있습니다. CMake를 사용하여 프로젝트를 컴파일하고 있습니다. 플러그인은 별도의 디렉토리에 컴파일됩니다. 내 문제는 CMake가 소스의 디렉토리 구조에서 바이너리 및 플러그인, 동적 라이브러리를 컴파일하고 저장한다는 것입니다. CMake가 파일을 ./bin 디렉토리 와 같은 곳에 저장하게하려면 어떻게합니까 ?

답변:


301

Oleg의 답변에서와 같이 설정해야 할 올바른 변수는 CMAKE_RUNTIME_OUTPUT_DIRECTORY 입니다. 루트 CMakeLists.txt에서 다음을 사용합니다.

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

대상별로 출력 디렉토리를 지정할 수도 있습니다.

set_target_properties( targets...
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

두 경우 모두 추가 할 수 있습니다 _[CONFIG]출력 디렉토리가 특정 구성 (구성에 대한 표준 값은 다음에 적용 할 변수 / 속성 이름에 DEBUG, RELEASE, MINSIZERELRELWITHDEBINFO).


8
RUNTIME_OUTPUT_DIRECTORY 대상 특성을 설정하여 대상별로이를 대체 할 수도 있습니다. 여기 문서를 참조하십시오 : cmake.org/cmake/help/...
DLRdave

4
DLRdave의 연결이 끊어졌습니다. cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca

한 번에 모든 구성에 적용하는 방법은 무엇입니까?
emlai

처음 세 명령은 모든 구성 (특히 CMAKE_RUNTIME_OUTPUT_DIRECTORY 설정)에 적용되어야합니다. 디버그 출력에 다른 디렉토리를 원할 경우 CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (예 :) 만 설정합니다. 정확한 동작은 사용중인 생성기 / 툴체인에 따라 다릅니다 (예 : Visual Studio 프로젝트 파일은 하나의 빌드 트리에 모든 구성이 포함되는 반면 makefile 생성기는 하나의 빌드 구성에 대한 메이크 파일 만 생성 함).
Adam Bowen

1
CMAKE_ARCHIVE_OUTPUT_DIRECTORY명령이 install(TARGETS <target_name>)여전히 "실행 가능 대상에 대한 런타임 대상을 제공하지 않음"에 대해 불평 한다는 점을 고려 하여 설정의 목적은 무엇입니까 ? 이 변수는 기본값을 제공하는 것으로 추정되므로 install명령에 a가 없으면 불평하지 않아야합니다 RUNTIME DESTINATION.
thiagowfx

30

사용하다 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
디렉토리에 대한 전체 경로 이름을 변수 값으로 사용하고 Adam Bowen의 답변과 같이 값에 후행 "/"를 넣지 마십시오.
DLRdave

4
전체 경로를 추가해야하는 이유는 무엇입니까? 프로젝트를 움직일 때 성가신 것 같습니다 ...
ScottF

8

사용에 EXECUTABLE_OUTPUT_PATH필요한 경로를 설정 CMake 변수를. 자세한 내용은 온라인 CMake 설명서를 참조하십시오.

CMake 2.8.8 문서


15
EXECUTABLE_OUTPUT_PATH는 지금도 작동하지만이 결과를 얻는 "오래된"방법입니다. Adam Bowen의 답변이 권장되는 방법입니다.
DLRdave

4

나에 관해서는 cmake 3.5를 사용하고 있는데 아래 ( set variable)가 작동하지 않습니다.

set(
      ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

그러나 이것은 작동합니다 ( set set_target_properties) :

set_target_properties(demo5
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

2
나는 세트 (CMAKE 아담의 답변을 사용하고 _... 그것은 작동하지만 당신은 추가 라이브러리 전에 그것을 할 때만은, 실행 파일 등 나는 그것이 나 같은 초보자를위한 중요한 참고 같아요.
ashrasmun

와. @ashrasmun은 (는) 몇 시간 후 미쳐 버리지 못했습니다. 이 명령의 순서가 매우 관련이 있다는 것을 깨닫기 전까지는 아무것도 작동하지 않았습니다.
절지 동물

2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

1

영어는 제 모국어가 아닙니다. 입력 오류를 용서하십시오.

이 줄 설정을 사용하십시오 :
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
CMakeLists.txt 프로젝트를 배치하십시오.
이 $ {PROJECT_SOURCE_DIR}은 프로젝트가있는 현재 소스 디렉토리입니다.
방황하면 왜 $ {EXECUTABLE_OUTPUT_PATH}입니까?
이 파일을 확인하십시오.CMakeCache.txt 후, 키워드 검색 output path,
모든 변수가 여기에 정의를이 프로젝트에 대한 자세한 설명을 제공하는 모든 setting·


0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)

8
답변에 설명을 추가해 주시겠습니까?
Paul Floyd

0

기본 CMakeLists.txt 또는 개별 파일에서 이것을 정의하는지 여부에 관계없이 여전히 모든 libs 및 bin을 기본 경로에서 원한다고 가정합니다.


0

이것에 추가하려면 :

CMAKE를 사용하여 Visual Studio 솔루션 을 생성 하고 Visual Studio 에서 컴파일 된 파일을 / bin으로 출력하려면 Peter의 답변을 약간 수정해야합니다.

# set output directories for all builds (Debug, Release, etc.)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.