gpt4 book ai didi

c++ - 如何在 CMake Superbuild 中查找 dll/so 文件

转载 作者:行者123 更新时间:2023-11-28 04:04:47 31 4
gpt4 key购买 nike

我已经使用 CMake Superbuild 设置了跨平台软件项目,其中使用 ExternalProject_Add 添加和构建依赖项。该项目在 Windows 和 Linux 上都编译,但是当我尝试运行生成的可执行程序时,它不起作用,因为它无法找到依赖项的 dll/so 文件。这并不奇怪,因为外部依赖的 dll/so 文件并没有放在输出目录中(下面可视化中的 bin)。

使用 ExternalProject_Add 添加的依赖项之一是 OpenCV。 OpenCv 由 super 构建构建后,我可以使用 find_package(OpenCv) 找到它。然后,我可以使用变量 OpenCV_LIBSOpenCV_INCLUDE_DIRS 来引用库和包含文件。但是,似乎没有变量告诉我 dll/so 文件所在的位置。

更复杂的是,在 Linux 和 Windows 上构建时,dll/so 文件似乎最终位于不同的文件夹中。这是我的项目结构的简化可视化。 Build/bin 是我的可执行程序和我的项目生成的 dll/so 文件的最终位置。


|-- 项目1
| |-- 源1.cpp
|-- 项目2
| |-- 源2.cpp
|-- CMake
| |-- super 构建.cmake
|-- CMakeLists.txt
|-- build
| |-- 外部项目
| |-- 斌

在 Windows 上,OpenCV dll 最终位于 external_projects 文件夹中:external_projects/OpenCV-build/bin/Debug,而在 Linux 上,.so 文件最终位于external_projects/OpenCV-build/lib

我想我可以为每个外部项目检查 dll/so 文件的最终位置,并通过使用 GLOB 和 if(WIN32) 等的组合来复制它们。但这似乎不是理想的。

在 CMake super 构建中执行此操作的正确方法是什么?如何使 dll/so 文件可用以便可执行程序可以找到它们?

更新澄清一下:CMake 文件夹中有一个 CMakeLists.txt 文件。此脚本调用 Superbuild.cmake,它(稍微简化)如下所示:


ExternalProject_Add(OpenCV ...) # 从github下载源码
ExternalProject_Add(libtiff...)# 从gitlab下载源码
...
ExternalProject_Add(myMainProject
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. # 在根项目文件夹中添加 CMakeLists.txt
取决于 ${myMainProjectDependencies} # OpenCV 和 libtiff
)
这导致在构建 myMainProject 之前构建依赖项。

最佳答案

您可以使用 CMake 设置安装目标,并将其配置为将二进制文件和 header 放在正确的位置:

# bin
if (${BUILD_SHARED_LIBS})
install(
FILES
$<TARGET_FILE:my_target>
DESTINATION
bin
COMPONENT
runtime
)
endif()

# lib
install(
TARGETS
my_target
DESTINATION
lib
COMPONENT
devel
)

# include
install(
FILES
Header1.hpp
Header2.hpp
DESTINATION
include/my_target
COMPONENT
devel
)

现在您可以将二进制文件、导入库和 header 安装到您的 CMAKE_INSTALL_PREFIX 路径,使用类似 ninja install 的东西(假设您使用 Ninja 作为生成器CMake)。

关于c++ - 如何在 CMake Superbuild 中查找 dll/so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58933367/

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