【问题标题】:CMake add_subdirectory()CMake add_subdirectory()
【发布时间】:2011-07-19 13:25:06
【问题描述】:

简介:

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

关于 add_subdirectory(),我遇到了一些我无法理解的事情。

让我给你看我的代码:

上下文:

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

  • CMakeLists.txt
  • 包括/
    • file1.h
    • file2.h
    • *.h
  • 源/
    • file1.cpp
    • file2.cpp
    • *.cpp
  • 测试/
    • CMakeLists.txt
    • 源/
      • testfile1.cpp
      • testfile2.cpp

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

我的目标:

  1. 我想将我的模块编译为库

  2. 我想用 test/ 文件夹中的代码测试库

这是我写的 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(以及其他第 3 部分库)链接的库中成功编译。但是测试二进制文件没有输出任何 MyProjectTest.sln。

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

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

【问题讨论】:

  • 你是对的,应该有一个 MyProjectTest.sln 解决方案。你的项目是公开的吗?您必须在问题中遗漏一些细节来解释为什么缺少它。您使用的是什么版本的 CMake?对于每个“项目”命令,都应该创建一个相应命名的 *.sln 文件。
  • 我使用的是 CMake 2.8,它是一个构建树(这是他们在文档中使用的术语,表示我不在源树本身而是在构建目录中构建 bin )....感谢查看了我的代码,再看一遍我不明白为什么它不起作用...我想到了使用相对路径的cmake,因此无法在src树中继续...我迷失了 CMake...

标签: cmake build-system


【解决方案1】:

这可能无法解决您原来的问题,但在您的 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

【讨论】:

    【解决方案2】:

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

    发现问题:

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

    由于这个“编码”错误仅出现在 CMakeLists 子目录中,因此无法读取,但在使用 CMake 解释时没有错误提示,这可能是我在运行 CMake 时没有返回错误的原因。

    解决方案:

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

    原因:

    实际上这可能意味着 CMake 的语法解析器可能不是为过滤这种以奇怪编码出现的字符而设计的,这就是为什么它给了我 3 天的紧张调试时间。

    【讨论】:

    • 我相信 CMake 中有一个选项或命令可以解决这个问题,因为 Windows 和 Linux 在行尾问题上有不同的标准。关于选择“\n”和“\r”中的一个或另一个。
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多