簡體   English   中英

如何最好地告訴CMake在哪里找到dll

[英]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都在同一文件夾中。 做這件事有很多種方法:

  1. 把兩個EXE和DLL到一個單一的“輸出”目錄通過設置RUNTIME_OUTPUT_DIRECTORYLIBRARY_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文件夾中。

  2. 或通過設置全局CMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_LIBRARY_OUTPUT_DIRECTORY變量,將對sample_project中的所有目標執行此操作。

  3. 構建后將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM