programing tip

CMake를 사용하여 DLL 파일을 실행 파일과 동일한 폴더에 복사하는 방법은 무엇입니까?

itbloger 2020. 9. 22. 07:46
반응형

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})

참고URL : https://stackoverflow.com/questions/10671916/how-to-copy-dll-files-into-the-same-folder-as-the-executable-using-cmake

반응형