3

介绍:

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

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

让我向您展示我的代码:

语境:

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

  • CMakeLists.txt
  • 包括/
    • 文件1.h
    • 文件2.h
    • *。H
  • 源/
    • 文件1.cpp
    • 文件2.cpp
    • *.cpp
  • 测试/
    • CMakeLists.txt
    • 源/
      • 测试文件1.cpp
      • 测试文件2.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。

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

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

4

2 回答 2

3

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

于 2011-07-20T13:38:08.840 回答
1

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

发现问题:

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

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

解决方案:

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

为什么:

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

于 2011-07-20T14:16:47.153 回答