CMake를 사용하여 DLL 파일을 실행 파일과 동일한 폴더에 복사하는 방법은 무엇입니까?
SVN에서 소스의 Visual Studio 파일을 생성하기 위해 CMake를 사용합니다. 이제 내 도구는 일부 DLL 파일이 실행 파일과 동일한 폴더에 있어야합니다. DLL 파일은 소스와 함께 폴더에 있습니다.
어떻게 변경할 수 있습니다 내 CMakeLists.txt
생성 된 비주얼 스튜디오 프로젝트 중 이미 출시 / 디버그 폴더에 특정 DLL 파일이되거나 편집에 복사 것 같은?
나는 add_custom_command
이것을 cmake -E copy_if_different...
. 전체 정보 실행
cmake --help-command add_custom_command
cmake -E
따라서 귀하의 경우에는 다음과 같은 디렉토리 구조가 있습니다.
/CMakeLists.txt
/src
/libs/test.dll
명령이 적용되는 CMake 대상이 MyTest
이면 CMakeLists.txt에 다음을 추가 할 수 있습니다.
add_custom_command(TARGET MyTest POST_BUILD # Adds a post-build event to MyTest
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
"${PROJECT_SOURCE_DIR}/libs/test.dll" # <--this is in-file
$<TARGET_FILE_DIR:MyTest>) # <--this is out-file path
/libs/
디렉토리 의 전체 내용 만 복사하려면 cmake -E copy_directory
다음을 사용하십시오 .
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs"
$<TARGET_FILE_DIR:MyTest>)
구성 (예 : 릴리스, 디버그)에 따라 다른 dll을 복사해야하는 경우 해당 구성으로 명명 된 하위 디렉토리에 /libs/Release
, 및 /libs/Debug
. 그런 다음 다음과 같이 구성 유형을 add_custom_command
호출 의 dll 경로에 삽입해야합니다 .
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
이 줄을 최상위 CMakeLists.txt 파일에 넣었습니다. CMake로 컴파일 된 모든 라이브러리와 실행 파일은 빌드 디렉터리의 최상위 수준에 배치되므로 실행 파일이 라이브러리를 찾을 수 있고 모든 것을 쉽게 실행할 수 있습니다.
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
이것은 프로젝트의 소스 디렉토리에서 미리 컴파일 된 바이너리를 복사하는 OP의 문제를 해결하지 못합니다.
수락 된 답변에 대한 부록, 별도의 답변으로 추가되어 코드 형식을 얻습니다.
동일한 프로젝트에서 dll을 빌드하는 경우 일반적으로 Release, Debug 등의 디렉토리에 있습니다. Visual Studio 환경 변수를 사용하여 올바르게 복사해야합니다. 예 :
"${PROJECT_BINARY_DIR}/your_library/\$\(Configuration\)/your_library.dll"
소스 및
"${CMAKE_CURRENT_BINARY_DIR}/\$\(Configuration\)/your_library.dll"
목적지. 탈출에주의하십시오!
구성에 CMake CMAKE_BUILD_TYPE 변수를 사용할 수 없습니다. VS 프로젝트 생성시 확인되고 항상 기본값이되므로 구성에 사용할 수 없습니다.
이것은 그들 중 하나에 유용합니다
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/lib CACHE
PATH "Directory where all the .lib files are dumped." FORCE)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/bin CACHE
PATH "Directory where .exe and .dll files are dumped." FORCE)
사용자 지정 대상 을 추가 하고 실행 가능한 대상 중 하나에 종속되도록 해야 할 수 있습니다 . 위의 기능을 사용하여 파일을 복사하려면
COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll
.
find_library 명령을 사용할 수도 있습니다.
find_library(<some_var> NAMES <name_of_lib> PATHS "<path/to/lib>")
정의 된 EXECUTABLE_PATH를 사용하면 예를 들면 다음과 같습니다.
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
you could move the .dll files that your executable need, with
file(COPY ${<some_var>}
DESTINATION ${EXECUTABLE_OUTPUT_PATH})
'programing tip' 카테고리의 다른 글
Git Add에 자세한 스위치가 있습니까? (0) | 2020.09.22 |
---|---|
Mac OS에서 SSH 시간 초과를 피하고 있습니까? (0) | 2020.09.22 |
속성 선택기를 사용하여 클래스를 일치시키는 이유는 무엇입니까? (0) | 2020.09.22 |
T-SQL의 기능과 같은 String.Format? (0) | 2020.09.22 |
IIS7에서 교차 출처 리소스 공유 활성화 (0) | 2020.09.22 |