我见过类似的问题,但不太像我发现自己陷入困境。我正在使用其他人的代码,他们的结构是这样的。
//db_manager.hclass db_manager{ 上课…
的 第一:你的榜样非常糟糕。 强> 请提供最低限度的工作示例。我理解你的问题是什么(循环依赖),但你的例子没有显示这个问题。这是您必须在架构级别上解决的问题。你无法在CMake中解决这个问题。
根据您显示的代码,您不需要在error.h中包含db_manager.h,因为在类Error的声明期间您没有使用db_manager中的任何内容。您只需要将它包含在error.cpp中,因为您正在使用db_manager中的一个静态方法。这样你就没有任何循环依赖。
我在下面添加了一个最小的工作示例,编译没有任何错误。
error.h
#ifndef _ERROR_H_ #define _ERROR_H_ #include <string> class Error { public: enum def_enum{ Val1, Val2}; bool read(int id); static bool logError(def_enum v, std::string msg); }; #endif /* _ERROR_H_ */
error.cpp
#include "error.h" #include "db_manager.h" bool Error::read(int id) { return db_manager::read(id); } bool Error::logError(Error::def_enum v, std::string msg) { //do error service stuff return true; }
db_manager.h
#ifndef _DB_MANAGER_H_ #define _DB_MANAGER_H_ #include <string> #include "error.h" class db_manager { public: static bool logError(Error::def_enum v, std::string msg); static bool read(int id); }; #endif /* _DB_MANAGER_H_ */
db_manager.cpp
#include "db_manager.h" bool db_manager::logError(Error::def_enum v, std::string msg) { return Error::logError(v, msg); } bool db_manager::read(int id) { //do db access stuff return true; }
main.cpp中
#include "db_manager.h" #include "error.h" int main(){ db_manager::read(1); db_manager::logError(Error::Val1, "Test"); Error e; e.read(2); return 0; }
的CMakeLists.txt
project(db_manager) add_executable(executable main.cpp db_manager.cpp error.cpp)