我使用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之前构建依赖项。