CMake add_subdirectory()

时间:2011-07-19 13:25:07

标签: cmake build-system

简介

我正在尝试使用CMake获取跨平台编译脚本(适用于Windows32上的VS 9.0和适用于Unix的Makefile)。

我遇到了一些我无法理解的关于add_subdirectory()的内容。

让我告诉你我的代码:

上下文

我的名为“module1”的模块的架构是这样的:

  • 的CMakeLists.txt
  • 包括/
    • file1.h
    • file2.h
    • *的.h
  • 的src /
    • file1.cpp
    • file2.cpp
    • *。CPP
  • 测试/
    • 的CMakeLists.txt
    • 的src /
      • testfile1.cpp
      • testfile2.cpp

我整个应用程序的体系结构由这些模块组成,这些模块本身就是可以独立工作的项目。

我的目标:

  1. 我想将模块编译为库

  2. 我想用测试/文件夹

  3. 中的代码测试库

    以下是我写的CMakeLists:

    这是我模块根目录中的CMakeLists.txt。

    #ENSURE MINIMUM VERSION OF CMAKE
    cmake_minimum_required(VERSION 2.8)
    
    #CONFIGURATION OF THE PROJECT   
        #NAME OF THE PROJECT    
         project(MyProject)
    
        #OUTPUT OF THE PROJECT  
        set(LIBRARY_OUTPUT_PATH lib/${CMAKE_BUILD_TYPE}) 
    
        #ADD THE HEADERS OF THE LIBRARY BEING CREATED   
        include_directories(include)
    
        #ADD 3rd PARTY OPENCV LIBRARIES     
        find_package(OpenCV REQUIRED)       
    
        #ADD 3rd PARTY XERCES LIBRARIES
        include_directories(${XERCES_INCLUDE_DIR})
        link_directories(${XERCES_LIB_DIR})     
        set(Xerces_LIBS xerces-c_3D.lib)
    
    
    #CONFIGURATION OF THE LIBRARY   
    file(GLOB_RECURSE MYPROJECT_MODULE_CXX src/*)   
    file(GLOB_RECURSE MYPROJECT_MODULE_HDR include/*)       
    
    #NAME OF THE PRESENT LIBRARY    
    set(MYPROJECT_MODULE_LIB_NAME myModuleLib)
    add_library(${MYPROJECT_MODULE_LIB_NAME}
            SHARED
            ${MYPROJECT_MODULE_CXX}
            ${MYPROJECT_MODULE_HDR}
            )   
    target_link_libraries(${MYPROJECT_MODULE_LIB_NAME}
                   ${OpenCV_LIBS}
                   ${Xerces_LIBS}
                   )
    
    #CONTINUE IN THE SUB FOLDERS
    add_subdirectory(test)
    

    然后,在test /文件夹中,这里是CMakeLists.txt

    #ENSURE MINIMUM VERSION OF CMAKE
    cmake_minimum_required(VERSION 2.8)
    
    #CONFIGURATION OF THE PROJECT
        #NAME OF THE PROJECT
        project(MyProjectTest)
    
        #OUTPUT OF THE PROJECT
        set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    
        #ADD OUR TESTED LIBRARY
        include_directories(../include)
        link_directories(../build/lib/${CMAKE_BUILD_TYPE})
    
    
    #CONFIGURATION OF THE EXE
        file(GLOB_RECURSE MYPROJECT_MODULE_TEST_CXX src/*)
    
        #NAME OF THE PRESENT EXECUTABLE
        set(MYPROJECT_MODULE_TEST_BIN_NAME myModuleTest)
        add_executable(${MYPROJECT_MODULE_TEST_BIN_NAME}
                   ${MYPROJECT_MODULE_TEST_CXX}
                   )
        target_link_libraries(${MYPROJECT_MODULE_TEST_BIN_NAME}
                      ${MYPROJECT_MODULE_LIB_NAME}
                      )
    

    问题

    CMake输出正确的MyProject.sln Visual Studio 9.0解决方案,该解决方案在我的库中与OpenCV和Xerces(以及其他第三方库)链接成功编译。但是测试二进制文件没有输出任何MyProjectTest.sln。

    我想,(and read in the CMake documentation)add_subdirectory(dir)用于在以下子目录中执行CMake(我的意思是,名称不能更清楚:p!),所以不应该它在test /目录中继续CMake并创建我的MyProjectTest.sln解决方案?

    我使用GUI CMake在我在模块的根目录中创建的构建目录中运行根CMakeLists.txt。当我探索构建目录时,我可以找到我的MyProjet.sln,一个测试/文件夹,但没有MyProjectTest.sln!

2 个答案:

答案 0 :(得分:2)

这可能无法解决您的原始问题,但在test/folder/CMakeLists.txt尝试更改

#ADD OUR TESTED LIBRARY
include_directories(../include)
link_directories(../build/lib/${CMAKE_BUILD_TYPE})

#ADD OUR TESTED LIBRARY
include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})

否则,您假设您的构建文件夹始终名为build

答案 1 :(得分:1)

经过三天的尝试,我终于找到了答案...... DLRdave爵士实际上是对的:问题不在于代码本身,而是来自“代码之外”的东西。

发现问题:

我使用Notepad ++创建并编辑了所有文件。实际上当用Windows记事本打开文件时(因为我很好奇)出现了一个奇怪的矩形符号,文件看起来不像我在Notepad ++上看到的那个 我发现符号是一个“\ n \ r \ n”,Notepad ++没有显示我(它必须被过滤)但是在Windows记事本上,你可以看到整个文件是“不纯的”并且出现在一行而不是我在Notepad ++上看到的布局。

由于这个“编码”错误只出现在子目录CMakeLists中,因此无法读取,但在使用CMake解释时没有说错误,这可能就是为什么我没有从运行CMake返回错误。

<强>解决方案:

我使用Java的native2ascii.exe工具来纠正编码错误。

原因:

实际上它可能意味着CMake的语法分析器可能不是为过滤这种带有奇怪编码的char而设计的,这就是为什么它给了我3天的强烈调试。