CMake可传递地复制dll
基本上,我希望CMake将依赖项的dll复制到可执行文件的同一目录中。假设我有以下目录结构:CMake可传递地复制dll,cmake,Cmake,基本上,我希望CMake将依赖项的dll复制到可执行文件的同一目录中。假设我有以下目录结构: my-project/ CMakeLists.txt lib/ CMakeLists.txt ... # Some source files app/ CMakeLists.txt ... # Some source files 库lib依赖于某些第三方dll,例如foo.dll。应用程序中的可执行文件,如app.
my-project/
CMakeLists.txt
lib/
CMakeLists.txt
... # Some source files
app/
CMakeLists.txt
... # Some source files
库lib
依赖于某些第三方dll,例如foo.dll。应用程序中的可执行文件,如app.exe
,取决于lib
我编写了一个FindFOO.cmake,使第三方库foo.dll
成为名为foo
的导入目标
现在,当我编译
app
时,为了运行可执行文件,foo.dll
必须与app.exe
位于同一目录中。如何使用cmake自动实现这一点?如果我想使用CPack将应用程序打包到安装程序中呢?CMAKE\u RUNTIME\u OUTPUT\u目录
是您的朋友
如果此变量是在创建某些目标之前创建的,如果目标是运行时
,则它将定义目标输出的放置位置
在您的情况下,它可以用来强制foo.dll
和app.exe
位于同一文件夹中。您的根目录CMakeLists.txt
应如下所示:
cmake_minimum_required(VERSION 3.15)
project(foo_and_app)
# app.exe and foo.dll will be in bin subfolder of build dir
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_subdirectory(lib)
add_subdirectory(app)
#not connected to placement, but only to package creation
include(CPack)
应该注意的是,该变量用于初始化添加的目标的属性,这意味着也可以通过直接操作适当的目标属性来实现一切
关于打包,通过使用install
cmake语句,无论运行时目标的位置如何,您所要求的都是可能的。在lib/CMakeLists.txt
中,您应该添加如下内容:
# suppose that the target named `foo`,
# i.e. it is added by add_library(foo SHARED .....)
install(TARGETS foo
RUNTIME DESTINATION bin
)
对于app/CMakeLists.txt
,也应该这样做:
# suppose that the target named `app`,
# i.e. it is added by add_executable(app .....)
install(TARGETS app
RUNTIME DESTINATION bin
)
如果您有这些安装语句,最终目标将是所选安装文件夹中的bin
文件夹
最后,以下是CMake文档的链接,描述:
您看到了吗?对于dll库,您必须使用库输出目录src:运行时用于添加可执行文件注意:您还有用于静态库的存档输出库…@Mizux:如果我没记错的话,Windows中的共享库由两个文件组成:一个
.dll
和一个关联的.lib
导入库文件。当您调用add_library(SHARED)
时,CMake会像处理.exe
文件一样处理。