我有以下设置(希望这不是一个例子):
A.H
typedef std::map<unsigned int, float> MyClass;
extern MyClass inst;
A.cpp
MyClass inst;
B.h
#include <A.h>
void foo();
B.cpp
#include <B.h>
void foo {
inst.myClassFunc();
}
现在,当我在B.cpp
中使用inst时,我得到undefined reference to inst
。
有关如何解决这个问题的想法吗?
答案 0 :(得分:10)
我知道这个问题已经过时了,但它仍然对某人有帮助。
对于定义它的编译单元,全局变量(此处:MyClass inst
)不应该是 extern
(此处:{{1 }})
实现这一目标的一种方法:
A.cpp
)并使用这些标题在* cpp中包含此标题。global.h
关键字(例如,使用extern
):global.h看起来像:
#ifdef
而A.h看起来像:
#ifdef A_H_
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN MyClass inst;
和A.cpp:
#ifndef A_H_
#define A_H_
// your header content (without globals)
#endif /* A_H_ */
希望它有所帮助!
答案 1 :(得分:0)
这只是一个例子,可以解决正在发生的事情。但是,基于上述情况,完全有可能当它遇到失败的行时,编译器不知道MyClass
中的实际内容,因此无法解析MyClassFunc
。
我们需要查看MyClass的定义并知道它的确切位置。
答案 2 :(得分:0)
您必须将上述文件A.cpp编译为
g++ -c A.cpp
g++ -c B.cpp
然后在创建可执行文件时,您应该按如下方式编写命令:
g++ A.o B.o
答案 3 :(得分:0)
从您发布的基本示例代码中我会说您忘记了B.cpp文件中的#include <B.h>
。