![](/img/trans.png)
[英]CMake: how to determine all the .DLL/.SO files that are need for an executable?
[英]How to find dll/so files in a CMake Superbuild
我已经使用 CMake Superbuild 设置了跨平台软件项目,其中使用ExternalProject_Add
添加和构建依赖项。 该项目在 Windows 和 Linux 上编译,但是当我尝试运行生成的可执行程序时,它不起作用,因为它找不到依赖项的 dll/so 文件。 这并不奇怪,因为外部依赖的 dll/so 文件没有放在 output 目录(下图可视化中的bin
)中。
使用ExternalProject_Add
添加的依赖项之一是 OpenCV。 在超级构建构建 OpenCv 之后,我可以使用find_package(OpenCv)
找到它。 然后我可以使用变量OpenCV_LIBS
和OpenCV_INCLUDE_DIRS
来引用库和包含文件。 但是,似乎没有变量可以告诉我 dll/so 文件的位置。
更复杂的是,在 Linux 和 Windows 上构建时,似乎 dll/so 文件最终位于不同的文件夹中。 这是我的项目结构的简化可视化。 Build/bin
是我的项目生成的可执行程序和 dll/so 文件的最终位置。
|-- Project1 | |-- Source1.cpp |-- Project2 | |-- Source2.cpp |-- CMake | |-- Superbuild.cmake |-- CMakeLists.txt |-- Build | |-- External_projects | |-- Bin
On Windows, the OpenCV dlls end up in the external_projects
folder: external_projects/OpenCV-build/bin/Debug
, wheras on Linux the.so files end up in external_projects/OpenCV-build/lib
.
我想我可以为每个外部项目检查 dll/so 文件的最终位置,并通过使用 GLOB 和if(WIN32)
等的组合来复制它们。但这似乎并不理想。
在 CMake 超级构建中执行此操作的正确方法是什么,如何使 dll/so 文件可用以便可执行程序可以找到它们?
更新澄清:CMake 文件夹中有一个 CMakeLists.txt 文件。 此脚本调用 Superbuild.cmake (有些简化)如下所示:
ExternalProject_Add(OpenCV...) # Downloads source from github ExternalProject_Add(libtiff...)# Downloads source from gitlab... ExternalProject_Add(myMainProject SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. # Adds CMakeLists.txt in root project folder DEPENDS ${myMainProjectDependencies} # OpenCV and libtiff )
这会导致在构建 myMainProject 之前构建依赖项。
您可以使用 CMake 设置安装目标,并将其配置为将二进制文件和标头放置在正确的位置:
# 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
)
现在您可以使用类似ninja install
的方式将二进制文件、导入库和头文件安装到您的CMAKE_INSTALL_PREFIX
路径(假设您使用 Ninja 作为 CMake 的生成器)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.