CMake add_subdirectory()



简介:

我正在尝试使用CMake来获得跨平台编译脚本(适用于Windows32上的VS9.0和Unix的Makefiles(。

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

让我给你看看我的代码:

上下文:

我的一个名为"module1"的模块的体系结构是这样的:

  • CMakeLists.txt
  • 包括/
    • 文件1.h
    • 文件2.h
    • *.h
  • src/
    • 文件1.cpp
    • 文件2.cpp
    • *.cpp
  • 试验/
    • CMakeLists.txt
    • src/
      • 测试文件1.cpp
      • 测试文件2.cpp

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

我的目标:

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

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

以下是我写的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)

然后,在测试/文件夹中,这里是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.

我想,(并在CMake文档中阅读(add_subdirectory(dir(用于在以下子目录中执行CMake(我的意思是,名称再清楚不过了:p!(,所以它不应该在test/目录中继续CMake并创建我的MyProjectTest.sln解决方案吗

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

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

经过三天的尝试,我终于找到了答案。。。事实上,德勒达夫爵士是对的:问题不是来自代码本身,而是来自"代码之外"的东西。

发现问题:

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

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

解决方案:

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

原因:

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

相关内容

  • 没有找到相关文章

最新更新