添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何在CMake超级构建中找到dll/so文件

0 人关注

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

其中一个使用 ExternalProject_Add 添加的依赖项是OpenCV。在Superbuild构建了OpenCv之后,我可以用 find_package(OpenCv) 找到它。然后我可以通过使用变量 OpenCV_LIBS OpenCV_INCLUDE_DIRS 来引用库和包含文件。然而,似乎没有变量可以告诉我dll/so文件的位置。

更复杂的是,当在Linux和Windows上构建时,似乎dll/so文件最终出现在不同的文件夹里。下面是我的项目结构的简化视觉图。替换代码6】是我的可执行程序和我的项目产生的dll/so文件的最终位置。

|-- Project1 | |-- Source1.cpp |-- Project2 | |-- Source2.cpp |-- CMake | |-- Superbuild.cmake |-- CMakeLists.txt |-- Build | |-- External_projects | |-- Bin

在Windows中,OpenCV的dlls在 external_projects 文件夹中。 external_projects/OpenCV-build/bin/Debug ,而在Linux上,.so文件则在 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之前构建依赖项。

5 个评论
find_package(OpenCV) runs either script FindOpenCV.cmake or 脚本 OpenCVConfig.cmake 。第一个脚本应该是由你提供的,这个脚本负责在Linux和Windows上定位东西。第二个脚本随OpenCV的安装而来,它已经包含了与特定安装相对应的确切路径。你是哪种情况?
@Tsyvarev 就在为OpenCV调用 ExternalProject_Add 之后,我将OpenCV_DIR定义为构建OpenCV的文件夹。在构建OpenCV时,它创建了一个名为OpenCVConfig.cmake的文件,所以我认为这就是正在使用的文件。
"在为OpenCV调用 ExternalProject_Add 之后,我已经定义了OpenCV_DIR" - 你说的 "之后 "是什么意思?在 CMakeLists.txt 脚本的下一行?请注意, find_package 在项目中不起作用,它是通过 ExternalProject_Add 添加在 同一项目 : find_package 立即查找文件(在 配置 阶段),但在 ExternalProject_Add 中指定的命令只在一个阶段执行。 build 阶段。实际上,我们并不清楚你所说的 "超级构建 "是什么意思。这只是一个顶级项目,还是一个通过 ExternalProject_Add 构建所有其他项目的项目。
是的,这可能有点不清楚。这是一个两步的过程。所以当find_package运行时,OpenCV已经被构建了。变量OpenCV_DIR被作为参数发送到构建我的项目的CMakeLists.txt脚本中,我猜这就是find_package知道调用OpenCVConfig.cmake的原因。我的项目的设置方式类似于 github.com/MITK/MITK
@Tsyvarev 我已经更新了我的原始问题,加入了更多关于项目及其依赖关系如何构建的细节。
c++
linux
windows
cmake
cross-platform
larsjr
larsjr
发布于 2019-11-19
1 个回答
Mark Ingram
Mark Ingram
发布于 2019-11-19
已采纳
0 人赞同

你可以用CMake设置一个安装目标,并配置它将你的二进制文件和头文件放在正确的位置。

# bin
if (${BUILD_SHARED_LIBS})
    install(
        FILES
            $<TARGET_FILE:my_target>
        DESTINATION
        COMPONENT
            runtime
endif()
# lib
install(
    TARGETS
        my_target
    DESTINATION
    COMPONENT
        devel
# include
install(
    FILES
        Header1.hpp
        Header2.hpp
    DESTINATION
        include/my_target
    COMPONENT