Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake可传递地复制dll_Cmake - Fatal编程技术网

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.

基本上,我希望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\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
文件一样处理。