繁体   English   中英

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

[英]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_LIBSOpenCV_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM