首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake add_subdirectory()

CMake add_subdirectory()
EN

Stack Overflow用户
提问于 2011-07-19 13:25:06
回答 2查看 9.9K关注 0票数 4

简介:

我试图使用CMake来获得跨平台编译脚本(对于Windows32上的VS9.0和Unix上的Makefiles )。

我正在经历一些我无法理解的关于add_subdirectory()的事情。

让我给你看我的密码:

上下文:

我对一个名为"module1“的模块的架构如下所示:

  • CMakeLists.txt
  • 包含/
    • file1.h
    • file2.h
    • *.h

  • 钢筋混凝土/
    • file1.cpp
    • file2.cpp
    • *.cpp

  • 测试/
    • CMakeLists.txt
    • 钢筋混凝土/
      • testfile1.cpp
      • testfile2.cpp

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

我的目标:

  1. 我想把我的模块编译成一个库。
  2. 我想用测试/文件夹中的代码测试这个库

下面是我写的CMakeLists:

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

代码语言:javascript
复制
#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)

,然后,在测试/文件夹中,下面是CMakeLists.txt

代码语言:javascript
复制
#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 VisualStudio9.0解决方案,该解决方案在我的库中成功编译,链接到OpenCV和Xerces (以及其他第3部分库)。但是,测试二进制文件没有输出任何MyProjectTest.sln。

我想,(并阅读CMake文档)使用add_subdirectory(dir)在以下子目录中执行CMake (我的意思是,名称不能更清楚:p !),所以它不应该在测试/目录中继续使用CMake并创建my MyProjectTest.sln解决方案吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-20 14:16:47

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

问题发现:

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

由于这个“编码”错误只出现在子目录CMakeLists中,所以在使用CMake进行解释时不能读取它,而是说没有错误,这可能就是我在运行CMake时没有返回错误的原因。

解决方案:

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

的原因:

实际上,它可能意味着CMake的语法分析器可能没有设计用于过滤这种以奇怪编码出现的字符,这就是为什么它给了我3天的密集调试时间。

票数 1
EN

Stack Overflow用户

发布于 2011-07-20 13:38:08

这可能解决不了原来的问题,但是在test/folder/CMakeLists.txt中尝试更改

代码语言:javascript
复制
#ADD OUR TESTED LIBRARY
include_directories(../include)
link_directories(../build/lib/${CMAKE_BUILD_TYPE})

代码语言:javascript
复制
#ADD OUR TESTED LIBRARY
include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})

否则,您将假设您的构建文件夹总是命名为build

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6747856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档