CMake TARGET_RUNTIME_DLLS is empty



我有git克隆,构建(与MSVC调试和发布),然后安装wxWidgets:

cmake -B build wxWidgets
cmake --build build --config <CONFIG>
cmake --install build --prefix my_install --config <CONFIG>

<CONFIG> = Debug<CONFIG> = Release

然后我使用下面的CMake脚本链接到它,按照wiki的建议:

cmake_minimum_required(VERSION 3.16)
project(Test)
add_executable(Test WIN32 Main.cpp)
# wxWidgets
SET(wxWidgets_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../thirdparty/my_install)
find_package(wxWidgets COMPONENTS core base REQUIRED)
include(${wxWidgets_USE_FILE})
target_link_libraries(Test PRIVATE ${wxWidgets_LIBRARIES})
# Copy runtime DLLs to the directory of the executable.
add_custom_command(TARGET Test POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "Runtime Dlls: $<TARGET_RUNTIME_DLLS:Test>"
)

我的目标是自动将dll复制到构建的可执行文件的目录中,以便在运行时可以找到它们。为此,我使用TARGET_RUNTIME_DLLS生成器表达式(遵循文档中的示例代码)。在上面的代码中,为了测试的目的,我只在构建时打印出表达式。问题是它是空的。

在安装和链接SDL之前,该方法对我有效,但是SDL提供了创建导入目标的包配置文件,通过IMPORTED_LOCATION_RELEASEIMPORTED_LOCATION_DEBUG定义DLL位置。对于wxWidgets,显然应该使用findxwidgets。cmake自带的cmake脚本,遗憾的是它没有定义生成的二进制文件。也许这就是TARGET_RUNTIME_DLLS没有被填充的原因。

有没有人知道,无论是如何获得TARGET_RUNTIME_DLLS填充或如何获得构建wxWidgets dll的列表为当前配置(发布/调试)后构建复制?

提前感谢!

我正在处理一个类似的问题

第一次检查:

  1. 您必须在windows平台上工作,否则此功能无法使用工作。
  2. 你的Cmake是3.21或以上

接下来是模糊部分。我认为你想要包含的库必须是一个Shared Imported库,你必须为IMPORTED_IMPLIB设置一个set_target_properties,这是一个。lib文件的路径(dll导入库,我认为它被称为),所以你必须确保它都设置在包库中,你试图链接到你的可执行文件。

如果你有这些可用的dll,你只是想使用它们,而不是实际构建它们,那么你可以编写自己的cmake脚本,将做我上面所说的。然后你可以在你的项目中包含这个cmake文件,然后链接到你的应用程序。

注意:我现在也在处理类似的问题,我刚才说的工作不太可靠。我有一些需要复制的文件,有些不需要。

编辑:

Cmake文档给出了一个更详细的解释,如果你使用find_package特性,这个库的设置应该是什么样子。

在这里找到:https://cmake.org/cmake/help/latest/command/add_library.html#imported-libraries

UNKNOWN库类型通常只在实现中使用查找模块。它允许导入库的路径(通常是发现使用find_library()命令)无需使用了解它是什么类型的图书馆。这在Windows上特别有用其中静态库和DLL的导入库都有相同的文件扩展名.

最新更新