gpt4 book ai didi

c++ - 在 CMake 项目中传递复制 dll

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:44 25 4
gpt4 key购买 nike

假设我有一个包含两个库的 CMake 项目 foobar , 和一个可执行文件 app :

cmake_minimum_required(VERSION 3.1)
project(app)

add_library(foo SHARED foo.cpp)
add_library(bar SHARED bar.cpp)
target_link_libraries(foo PUBLIC bar)

add_executable(app main.cpp)
target_link_libraries(app foo)

所以首先,当我尝试在 Windows 上编译这个项目时,它因错误 LNK1104 - cannot open file 'bar.lib' 而失败。 .我究竟做错了什么?我的意思是,这就像有史以来最基本的例子,它怎么会失败呢?我正在使用 Visual Studio 15.4.2 (MSVC 14.11.25503) 和 CMake 3.9.1 进行编译。

下一个问题,我想要我的 foo.dllbar.dll自动复制到app.exe所在文件夹将被编译(我假设它将是 $<TARGET_FILE_DIR:app> )。 我可以通过向 foo 添加属性/自定义命令来做到这一点吗?和 bar无需修改 foo 的方式和 bar链接到 app

换句话说,我想修改上面的脚本,这样,如果我添加一个新的目标可执行文件 app2 , 对 target_link_libraries(app2 foo) 的简单调用我需要的就是我的foo.dllbar.dll复制到 app2 的目标文件夹.

我目前遇到的问题是涉及 add_custom_command( ... COMMAND ${CMAKE_COMMAND} -E copy_if_different ... ) 的现有解决方案需要添加到最终目标appapp2明确地,我不能只是add_custom_command(foo ...)因为appapp2可以在任意文件夹中结束。

我正在考虑修改 target_link_libraries(app ...)包装对我自己的函数(复制 dll 的函数)的调用并调用旧的 _target_link_libraries(app ...) ,但我不确定这是否是最干净的方法,并且想知道是否有更好的方法。

最后,我希望我们找到的任何解决方案也适用于 IMPORTED未编译为 CMake 子项目的目标和库。

最佳答案

So first, when I try to compile this project on Windows, it failed with an error LNK1104 - cannot open file 'bar.lib'. What am I doing wrong?

您的库不导出任何内容,这就是它不创建导入库(他提示的 .lib 文件)的原因。确保您的源文件确实定义了一些符号,然后确保这些符号实际上是从 DLL 中导出的。 CMake 甚至附带 a module that provides portable macros for exporting symbols .

Next question, I want my foo.dll and bar.dll to be automatically copied to the folder where app.exe will be compiled (I assume it will be $). Can I do that by adding properties/custom commands to foo and bar without modifying the way that foo and bar are linked to app?

不幸的是,CMake 目前没有对运行时依赖管理的适当支持。这就是阻止它通过对 target_link_libraries 的简单调用来工作的原因。 CMake 开发人员已经多次讨论过这样的功能,但似乎很难做到正确(尽管我不太熟悉这里的细节)。

我能想到的最方便的方法是让提供库提供一个 CMake function将所有相关的 DLL 复制到作为参数提供给它的文件夹中。这仍然很痛苦,但至少您保留了有关要使用提供的库复制哪些 DLL 的详细信息。

关于c++ - 在 CMake 项目中传递复制 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47139378/

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