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 문제를 해결하지 못합니다.
답변
내 프로그램의 Windows 빌드를 만들려고 할 때 오늘이 문제가 발생했습니다. 그리고이 모든 답변이 저를 만족시키지 못했기 때문에 저는 스스로 조사를했습니다. 세 가지 주요 문제가 있습니다.
-
디버그 빌드를 라이브러리의 디버그 버전과 연결하고 릴리스 빌드를 라이브러리의 릴리스 빌드와 각각 연결하고 싶었습니다.
-
또한 올바른 버전의 DLL 파일 (Debug / Release)을 출력 디렉토리에 복사하고 싶었습니다.
-
복잡하고 깨지기 쉬운 스크립트를 작성하지 않고이 모든 것을 달성하고 싶었습니다.
github에서 일부 CMake 매뉴얼과 일부 다중 플랫폼 프로젝트를 탐색 한 후이 솔루션을 찾았습니다.
“IMPORTED”속성을 사용하여 라이브러리를 대상으로 선언하고 디버그를 참조하고 .lib 및 .dll 파일을 릴리스하십시오.
add_library(sdl2 SHARED IMPORTED GLOBAL)
set_property(TARGET sdl2 PROPERTY IMPORTED_IMPLIB_RELEASE "${SDL_ROOT_PATH}/lib/SDL2.lib")
set_property(TARGET sdl2 PROPERTY IMPORTED_LOCATION_RELEASE "${SDL_ROOT_PATH}/bin/SDL2.dll")
set_property(TARGET sdl2 PROPERTY IMPORTED_IMPLIB_DEBUG "${SDL_ROOT_PATH}/lib/SDL2d.lib")
set_property(TARGET sdl2 PROPERTY IMPORTED_LOCATION_DEBUG "${SDL_ROOT_PATH}/bin/SDL2d.dll")
평소와 같이이 대상을 프로젝트와 연결
target_link_libraries(YourProg sdl2 ...)
이전 빌드 이후 어떻게 든 변경된 경우 dll 파일을 대상에 복사하는 사용자 지정 빌드 단계를 만듭니다.
add_custom_command ( TARGET YourProg POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:sdl2> $<TARGET_FILE_DIR:YourProg>
)
답변
수락 된 답변에 대한 부록, 별도의 답변으로 추가되어 코드 형식을 얻습니다.
동일한 프로젝트에서 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 프로젝트 생성 시간에 확인되고 항상 기본값이되므로 구성에 사용할 수 없습니다.
답변
find_library 명령을 사용할 수도 있습니다.
find_library(<some_var> NAMES <name_of_lib> PATHS "<path/to/lib>")
정의 된 EXECUTABLE_PATH를 사용하면 예를 들면 다음과 같습니다.
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
실행 파일에 필요한 .dll 파일을 이동할 수 있습니다.
file(COPY ${<some_var>}
DESTINATION ${EXECUTABLE_OUTPUT_PATH})
답변
이것은 그들 중 하나에 유용합니다
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)