[英]How to best tell CMake where to find dll
我有一個來自驚人教程的簡單項目結構
https://rix0r.nl/blog/2015/08/13/cmake-guide/
它看起來如下:
- src
- CMakeLists.txt
- mylib
- include/mylib/mylibclass.h
- src/mylibclass.cpp
- CMakeLists.txt
- myapp
- src/myapp.cpp
- CMakeLists.txt
頂層CMakeLists.txt包含:
cmake_minimum_required( VERSION 3.6 )
project( sample_project VERSION 0.1 LANGUAGES CXX )
set( BUILD_SHARED_LIBS ON CACHE BOOL "" )
add_subdirectory( mylib )
add_subdirectory( myapp )
mylib文件夾中的CMakeLists.txt包含:
add_library( mylib src/mylibclass.cpp include/mylib/mylibclass.h )
set_target_properties( mylib PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON )
target_include_directories( mylib
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> PRIVATE src )
myapp文件夾中的一個包含:
add_executable( myapp src/myapp.cpp )
target_link_libraries( myapp mylib )
我想使用此結構來開發mylib(作為由BUILD_SHARED_LIBS確定的共享庫或靜態庫)和myapp。 為此,我想將myapp設置為Visual Studio中的啟動項目,並在MSVC調試器中編譯並運行。 對於沒有額外CMake代碼的共享庫,這是不可能的,因為myapp.exe不知道在哪里可以找到mylib.dll。
最好的CMake做法是什么告訴程序在哪里可以找到dll?
編輯:
基於@Andre的建議,我在頂級CMakeLists.txt中添加了以下幾行:
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out CACHE STRING "" )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out CACHE STRING "" )
發生問題,因為當Visual Studio嘗試啟動myapp.exe時,您的mylib.dll與myapp.exe不在同一文件夾中,也不在%PATH%環境變量中
顯而易見的解決方案是確保dll和exe都在同一文件夾中。 做這件事有很多種方法:
把兩個EXE和DLL到一個單一的“輸出”目錄通過設置RUNTIME_OUTPUT_DIRECTORY和LIBRARY_OUTPUT_DIRECTORY上你的目標屬性:
set_target_properties( myapp PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${sample_project_BINARY_DIR}/build_results/bin ) set_target_properties( mylib PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${sample_project_BINARY_DIR}/build_results/bin )
這會將myapp.exe和mylib.dll生成到頂級構建文件夾中的單個build_results/bin
文件夾中。
或通過設置全局CMAKE_RUNTIME_OUTPUT_DIRECTORY和CMAKE_LIBRARY_OUTPUT_DIRECTORY變量,將對sample_project中的所有目標執行此操作。
構建后將dll復制到exe位置,例如使用
add_custom_command(TARGET mylib POST_BUILD命令$ {CMAKE_COMMAND} -E復制mylib.dll $ {myapp_BINARY_DIR} /。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.