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