Tôi muốn sử dụng add_custom_command
để đạt được điều này cùng với cmake -E copy_if_different...
. Để biết đầy đủ chạy
cmake --help-command add_custom_command
cmake -E
Vì vậy, trong trường hợp của bạn, nếu bạn có cấu trúc sau đây thư mục:
/CMakeLists.txt
/src
/libs/test.dll
và mục tiêu CMake của bạn mà lệnh áp dụng là MyTest
, sau đó bạn có thể thêm thông tin sau vào CMakeLists.txt của bạn:
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
Nếu bạn chỉ muốn toàn bộ nội dung của thư mục /libs/
sao chép, sử dụng 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>)
Nếu bạn cần phải sao chép dlls khác nhau tùy thuộc vào cấu hình (Release, Debug, ví dụ) sau đó bạn có thể có các thư mục con này được đặt tên theo cấu hình tương ứng: /libs/Release
và /libs/Debug
. Sau đó bạn cần phải tiêm loại cấu hình vào đường dẫn đến dll trong add_custom_command
cuộc gọi, như thế này:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
Ghi chú nhanh về những gì đã hoạt động trong trường hợp của tôi trong trường hợp nó giúp người khác trong tương lai: Tôi có một dự án thư viện tĩnh mà thực thi chính liên kết tùy chọn chống lại, và thư viện đó yêu cầu một DLL được sao chép nếu được thêm vào. Vì vậy, trong tệp CMakeLists.txt của thư viện đó, tôi đã sử dụng '$ {CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$' cho đích đích. Nếu không nó sẽ sao chép nó vào đường dẫn xây dựng thư viện, đó là vô ích. –
AberrantWolf