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

时间:2019-11-19 11:44:45

标签: c++ linux windows cmake cross-platform

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

在Windows上,OpenCV dll最终位于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之前先构建依赖项。

1 个答案:

答案 0 :(得分:1)

您可以使用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
)

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