【问题标题】:CMake with multiple subdirectories not compiling具有多个子目录的 CMake 未编译
【发布时间】:2016-10-17 02:36:47
【问题描述】:

我的问题是 CMake 拒绝编译并给出以下错误:

 [orpheus@Poseidon build]$ make 
 sources : /home/orpheus/Projects/Personal/C++/test/testProj/src/helloworld/MyClass.cpp/home/orpheus/Projects/Personal/C++/test/testProj/src/helloworld.cpp
 headers : /home/orpheus/Projects/Personal/C++/test/testProj/include/helloworld/MyClass.hpp
 -- Configuring done
 -- Generating done
 -- Build files have been written to: /home/orpheus/Projects/Personal/C++/test/build
 [ 33%] Building CXX object CMakeFiles/TEST.dir/testProj/src/helloworld/MyClass.cpp.o
 /home/orpheus/Projects/Personal/C++/test/testProj/src/helloworld/MyClass.cpp:1:51: fatal error: testProj/include/helloworld/MyClass.hpp: No such file or directory
  #include "testProj/include/helloworld/MyClass.hpp"
                                                    ^
 compilation terminated.
 make[2]: *** [CMakeFiles/TEST.dir/build.make:63:      CMakeFiles/TEST.dir/testProj/src/helloworld/MyClass.cpp.o] Error 1
 make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/TEST.dir/all] Error 2
 make: *** [Makefile:84: all] Error 2

我对 CMake 比较陌生,并且已经阅读了我能找到的大部分教程以及我能找到的所有相关堆栈溢出问题,但是似乎没有什么能完全满足我的特殊需求,我做到了(在我的调整中)偶然发现了一种没有发生这种情况的方式(不幸的是我现在无法复制它),但是这给了我一个链接错误声称:

 c++; fatal error: no input files

我应该使用include_directory() 命令而不是set() 添加头文件吗?

我决定不使用glob() 根据CMake documentation 添加源的方法,我的解决方案基于this thread 和各种教程。

我的项目结构如下:

test/
 |
 +--CMakeLists.txt
 +--build/
 |     |----CMakeFiles/
 |     |----etc
 |
 +--testProj/
 |     +----CMakeLists.txt
 |     +----include
 |     |       +----CMakeLists.txt
 |     |       +----helloworld/
 |     |       |        +----CMakeLists.txt
 |     |       |        +----MyClass.hpp  
 |     |
 |     |----src
 |     |     +----helloworld.cpp
 |     |     +----CMakeLists.txt
 |     |     +----helloworld/
 |     |     |       +----CMakeLists.txt
 |     |     |       +----MyClass.cpp

文件如下:

测试/CMakeFiles.txt

 cmake_minimum_required(VERSION 3.6.1)
 project(TEST)
 add_subdirectory(testProj)
 add_executable(${CMAKE_PROJECT_NAME} ${sources} ${headers})
 set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 set(extraFlags "-Wall -Wextra -Weffc++ -pedantic -pedantic-errors -std=c++14")
 set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${extraFlags})

test/testProj/CMakeLists.txt

 include_directories(include)
 add_subdirectory(src)
 add_subdirectory(include)
 set(sources ${sources} PARENT_SCOPE)
 set(headers ${headers} PARENT_SCOPE)

test/testProj/include/CMakeLists.txt

 include_directories(helloworld)
 add_subdirectory(helloworld)
 set(headers ${headers} PARENT_SCOPE)

test/testProj/include/helloworld/CMakeLists.txt

 set(
    headers
    ${headers}
    ${CMAKE_CURRENT_SOURCE_DIR}/MyClass.hpp
    PARENT_SCOPE
)

test/testProj/src/CMakeLists.txt

 add_subdirectory(helloworld)
 set(
        sources 
        ${sources} 
        ${CMAKE_CURRENT_SOURCE_DIR}/helloworld.cpp 
        PARENT_SCOPE
 )

test/testProj/src/helloworld/CMakeLists.txt

 set(
    sources
    ${sources}
    ${CMAKE_CURRENT_SOURCE_DIR}/MyClass.cpp
    PARENT_SCOPE
    )

当我将头穿过显示器时,请有人指出我正确的方向。

【问题讨论】:

    标签: c++ build compiler-errors cmake subdirectory


    【解决方案1】:

    问题确实是我的“include_directories()”,我没有意识到这是一个recursive command,使包含子目录中的工作变得多余,我通过将以下行添加到我的根目录CMakeLists.txt 来解决这个问题

     target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/testProj/include/)
    

    然后修改我的#include 语句以反映testProj/include 目录现在位于我的包含路径中。

    除了删除嵌套子目录中的其他 CMakeList 文件现在的冗余代码

    感谢Jacob Panikulum 为我指明了正确的方向。

    【讨论】:

      【解决方案2】:

      试试

      #include <MyClass.hpp>

      引号告诉编译器寻找相对路径。相对于MyClass.cpp,该路径上确实不存在标头

      尖括号告诉编译器开始查找您的 CMake include_directories 文件夹。由于您执行了include_directories(hello_world),当您包含 时,编译器将开始查找include/hello_world

      【讨论】:

      • 当我分别在 MyClass.cpp 和 helloworld.cpp 中使用 #include "../../include/helloworld/MyClass.hpp"#include "../include/helloworld/MyClass.hpp" 时,一切都编译得很好。但是我猜我的include_directory() 语句有问题,因为使用#include<MyClass.hpp> 不起作用。
      猜你喜欢
      • 2023-02-25
      • 2021-12-09
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多