【问题标题】:Include header file causes compilation error when added to a specific class包含头文件添加到特定类时会导致编译错误
【发布时间】:2021-06-15 10:19:42
【问题描述】:

我对以下项目结构有疑问。它不想正确编译。

\apps
  |____ \app1
  |        |____ App1.cpp, App1.h
  |        |____ CMakeLists.txt
  |                
  |____ \src
          |____ \lib_a
                   |____ \include : Class_a.h
                   |____ Class_a.cpp
                   |____ CMakeLists.txt
                \lib_b
                   |____ \include : Class_b.h
                   |____ Class_b.cpp
                   |____ CMakeLists.txt
                \lib_c
                   |____ \include : Class_c.h, Class_data1c.h, Class_data2c.h
                   |____ Class_c.cpp, Class_data1c.cpp, Class_data2c.cpp
                   |____ CMakeLists.txt

地点:

.\app1\CMakeLists.txt:

add_executable(app1 "App1.cpp" "App1.h")
target_compile_features(app1 PRIVATE cxx_std_11)

target_link_libraries(app1 PRIVATE lib_a)
target_link_libraries(app1 PRIVATE lib_b)
target_link_libraries(app1 PRIVATE lib_c)

.\src\lib_a\CMakeLists.txt:

set(LIBA_SRC "Class_a.cpp")
set(LIBA_H "./include/Class_a.h")

add_library(lib_a ${LIBA_SRC} ${LIBA_H})

target_include_directories(lib_a PUBLIC "include")
target_link_libraries(lib_a PRIVATE lib_b lib_c)

target_compile_features(lib_a PUBLIC cxx_std_11)

source_group(
  TREE "${CMAKE_CURRENT_SOURCE_DIR}/include"
  PREFIX "Header Files"
  FILES ${LIBA_H})
  

.\src\lib_b\CMakeLists.txt:

set(LIBB_SRC "Class_b.cpp")
set(LIBB_H "./include/Class_b.h")

add_library(lib_b ${LIBB_SRC} ${LIBB_H})

target_include_directories(lib_b PUBLIC "include")
target_link_libraries(lib_b PRIVATE lib_a lib_c)

target_compile_features(lib_b PUBLIC cxx_std_11)

source_group(
  TREE "${CMAKE_CURRENT_SOURCE_DIR}/include"
  PREFIX "Header Files"
  FILES ${LIBB_H})
  

.\src\lib_c\CMakeLists.txt:

set(LIBC_SRC "Class_c.cpp" "Class_data1c.cpp" "Class_data2c.cpp")
set(LIBC_H "./include/Class_c.h" "./include/Class_data1c.h" "./include/Class_data2c.h")

add_library(lib_c ${LIBC_SRC} ${LIBC_H})

target_include_directories(lib_c PUBLIC "include")
target_link_libraries(lib_c PRIVATE lib_a lib_b)

target_compile_features(lib_c PUBLIC cxx_std_11)

source_group(
  TREE "${CMAKE_CURRENT_SOURCE_DIR}/include"
  PREFIX "Header Files"
  FILES ${LIBC_H})
  

类的定义如下(在每个自己的文件中):

#include "Class_b.h"
#include "Class_c.h"
class Class_a{
    Class_a();
    void func1(class_b::enum_type n);
    void func2(class_c::enum_type n);
}

#include "Class_a.h"
#include "Class_c.h"
class Class_b{
    Class_b();
    void func1(class_a::enum_type n);
    void func2(class_c::enum_type n);
    
    Class_c obj_b;
}

#include "Class_a.h"
#include "Class_b.h"
#include "Class_data1c.h"
class Class_c{
    Class_b();
    void func1(class_a::enum_type n);
    void func2(class_b::enum_type n);
    
    Class_data1c data1;
}

#include "Class_data2c.h"
class Class_data1c{
    Class_data1c();
    
    Class_data2c data2;
}

问题是,如果我在 Class_b 中包含 Class_c 标头,则会收到找不到 Class_c 的错误。如果我删除它,那么一切都会编译并运行。 我认为 CMAKE 定义文件和/或项目结构有问题。 你能帮我理解这个项目有什么问题吗?

【问题讨论】:

  • 您如何期望class_a 包含class_bclass_b 包含class_a?您在这里没有看到无限循环/依赖关系吗?
  • 是的,注意到了 :(。对不起。谢谢。

标签: c++ cmake


【解决方案1】:

我看到你有依赖循环:class_a 包括 class_b,class_b 包括 class_a 等等。 为避免此问题,您可以在所有 hedar 文件中使用防御者来避免此循环:

#ifndef    YOUR_NAMESPACE_YOUR_FILENAME_H
#define    YOUR_NAMESPACE_YOUR_FILENAME_H

#include //all your includes

class MyClass {
    //content of your class
}


#endif //YOUR_NAMESPACE_YOUR_FILENAME_H

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多