我有一个问题,是的 我承认在 之前已经提出过这样的问题,但是他们都没有真正帮助我,因为背景和错误的种类给出的不完全一样。
我有一个项目,我正在尝试使用makefile进行编译。编译过程如下:
game_f.exe : objects/game_f.o objects/game_f_main.o archives/io.a
@g++ $^ $(ALL_OTHER_NEEDED_LIBS) -o $@ -std=c++11 -pedantic -Wall -g
现在这些行正在创建“多个定义”错误。如:
io.cpp:(.text+0x1FDA) : multiple definitions of <some function or variable name> :
archives/io.a(io.o):io.cpp:(.text+0x1FDA) : defined for the first time here
现在这来自我创建命名空间的头文件。命名空间是这样创建的:
io.h :
namespace io {
extern int TermWidth;
[some other variables, declared with "extern <some type> name;"]
extern void getTermWidth();
[some other functions, declared with "extern <some type> name(args)"
}
io.cpp :
namespace io {
TermWidth = 0;
[other variables definitions]
void getTermWidth() { ... }
}
编译时,编译器似乎忽略了extern
字。但奇怪的是 如果我键入整个g ++行,而不通过makefile ,编译就可以了。
顺便说一句,这在我的macOS机器上进行编译时顺便说一下,甚至更奇怪。
g ++是否有extern
定义的特殊选项?这是g++
和make
的已知问题吗?我怎么能避免这个错误?
编辑:是的,.h文件包含警卫。