gpt4 book ai didi

CMake 复制 dll 传递

转载 作者:行者123 更新时间:2023-12-05 05:09:06 44 4
gpt4 key购买 nike

基本上我希望 CMake 将依赖项的 dll 复制到可执行文件的同一目录。假设我有以下目录结构:

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_RUNTIME_OUTPUT_DIRECTORY 是你的 friend 。

如果这个变量是在创建一些目标之前创建的,如果目标是RUNTIME,它将定义目标输出的放置位置。

在您的情况下,它可用于强制 foo.dllapp.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 文档的链接,描述:

CMAKE_RUNTIME_OUTPUT_DIRECTORY variable

RUNTIME cmake targets

install(TARGETS ...)

关于CMake 复制 dll 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57791709/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com