我有以下项目结构:
- CMakeLists.txt // [1]
D Dependencies
-- CMakeLists.txt // [2]
D MySubProject
-- CMakeLists.txt // [3]
[1]是我的主要cmake文件,我在其中定义了一个带有project(..)的项目,并使用add_subdirectory(..)添加了directoires Dependencies和MySubProject。
[2]是一个cmake文件,我没有用项目(..)显式创建项目。在这里,我只需设置我的依赖项,例如对于OpenCV呼叫:
find_package(OpenCV REQUIRED)
[3]是一个cmake文件,其中我明确地定义了一个带项目(..)的子项目。该子项目链接到OpenCV依赖项:
project(MySubProject)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(MySubProject main.cpp)
target_link_libraries(MySubProject ${OpenCV_LIBS})
我遇到的问题是在[3]中我无法访问[2]的结果,例如OpenCV_LIBS或OpenCV_INCLUDE_DIRS。如果我将以下行添加到[2]
set(OpenCV_LIBS ${OpenCV_LIBS} CACHE STRING "")
set(OpenCV_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS} CACHE STRING "")
我可以在[3]中访问它们,但OpenCV_LIBS的内容看起来像
opencv_world.lib
这对我使用OpenCV 3.0和MSVC 11 2012的设置不起作用。库名称缺少版本后缀。如果直接在[3]中调用find_package(OpenCV REQUIRED)命令,OpenCV_LIBS看起来是正确的,即:
opencv_world330.lib
当我在[2]中调用find_package(..)并通过在缓存中设置结果变量使得结果变量全局化时,如何实现我的OpenCV_LIBS的正确后缀?
答案 0 :(得分:0)
如果我换行
add_subdirectory(Dependencies)
[1]的与
include(${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/CMakeLists.txt)
[2]中所有find_ *命令的结果是全局可访问的,例如在[3]中,find_package(OpenCV REQUIRED)的工作方式也应该如此,并添加了版本后缀。