gpt4 book ai didi

c++ - 具有多个子目录的 CMake 未编译

转载 作者:行者123 更新时间:2023-11-28 05:28:16 25 4
gpt4 key购买 nike

我的问题是 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() 添加头文件吗?

根据 CMake documentation,我决定不使用 glob() 添加源的方法我的解决方案基于 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})

测试/testProj/CMakeLists.txt

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

测试/testProj/include/CMakeLists.txt

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

测试/testProj/include/helloworld/CMakeLists.txt

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

测试/testProj/src/CMakeLists.txt

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

测试/testProj/src/helloworld/CMakeLists.txt

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

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

最佳答案

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

来解决此问题
 target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/testProj/include/)

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

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

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

关于c++ - 具有多个子目录的 CMake 未编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40077722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com