【发布时间】: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_b和class_b包含class_a?您在这里没有看到无限循环/依赖关系吗? -
是的,注意到了 :(。对不起。谢谢。