【问题标题】:How do I use CMake's add_subdirectory without endless loops如何在没有无限循环的情况下使用 CMake 的 add_subdirectory
【发布时间】:2015-05-08 21:53:51
【问题描述】:

我有一个想要使用 OpenCV 和 googletest 构建的应用程序。使用我拥有的 CMakeLists.txt,我得到了一个无限循环,CMake 不断将 googletest 目录添加到构建目录。

我已将 googletest 添加为子目录(即使它不在实际的项目树中),因为我读到为每个项目重新编译它可以防止各种麻烦。当我取消注释 add_subdirectory 行时,不再有无限循环。

我的 CMake 文件:

cmake_minimum_required(VERSION 2.8.4)
project(imageprocessing)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

IF(NOT DEFINED ENV{OpenCV_DIR})
set(ENV{OpenCV_DIR} "/usr/local/opencv")
ENDIF(NOT DEFINED ENV{OpenCV_DIR})
MESSAGE("Using OpenCV from location: " $ENV{OpenCV_DIR} " (Override by exporting OpenCV_DIR)")

find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

file(GLOB SOURCE_FILES "src/main/cpp/*.cpp")
add_executable(imageprocessing ${SOURCE_FILES})
target_link_libraries(imageprocessing ${OpenCV_LIBS} ) # <-- Line 16.

##########
# TESTING
##########
enable_testing()

IF(NOT DEFINED ENV{GOOGLETEST_DIR})
    set(ENV{GOOGLETEST_DIR} "/usr/local/googletest/gtest-1.7.0")
ENDIF(NOT DEFINED ENV{GOOGLETEST_DIR})
MESSAGE("Using Google Test from location: " $ENV{GOOGLETEST_DIR} " (Override by exporting GOOGLETEST_DIR)")

add_subdirectory("${GOOGLETEST_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/lib_googletest") # <-- EXCLUDE_FROM_ALL does not make a difference.

include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

##############
# Unit Tests
##############
file(GLOB TEST_SOURCE_FILES "src/test/cpp/*.cpp")
add_executable(runUnitTests ${TEST_SOURCE_FILES})
target_link_libraries(runUnitTests gtest gtest_main)

add_test(NAME test_images COMMAND runUnitTests)

弹出的错误信息:

CMake Error at CMakeLists.txt:16 (target_link_libraries):
  Attempt to add link library "opencv_core" to target "imageprocessing" which is not built in this directory.

我的环境:

$ cmake -version
cmake version 2.8.12.2

【问题讨论】:

    标签: c++ cmake googletest


    【解决方案1】:

    使用正确的变量会有所帮助。

    问题摘录:

    IF(NOT DEFINED ENV{GOOGLETEST_DIR})
        set(ENV{GOOGLETEST_DIR} "/usr/local/googletest/gtest-1.7.0")
    ENDIF(NOT DEFINED ENV{GOOGLETEST_DIR})
    MESSAGE("Using Google Test from location: " $ENV{GOOGLETEST_DIR} " (Override by exporting GOOGLETEST_DIR)")
    
    add_subdirectory("${GOOGLETEST_DIR}" # <-- THIS SHOULD READ $ENV{GOOGLETEST_DIR}!
    "${CMAKE_CURRENT_BINARY_DIR}/lib_googletest") # <-- EXCLUDE_FROM_ALL does not make a difference.
    

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      相关资源
      最近更新 更多