我对gcc比较新,我正在使用'gcc(tdm-1)5.1.0'。我错误地遇到了一个非常特殊的情况。我把我的担忧缩小到一个非常小的可重复的例子......
的main.cpp
extern int g;
int main(){
return g;
}
someOtherFile.cpp
#include<windows.h>
RECT g;
这是我用
编译的gcc -c someOtherFile.cpp
gcc main.cpp someOtherFile.o
这将无误地链接。
我在这里遗漏了一些关于为什么允许链接的内容?
答案 0 :(得分:4)
3.5 / 10:
在对类型进行所有调整(其中typedefs(7.1.3)被其定义替换)之后,引用给定变量或函数的所有声明指定的类型应相同,除了数组对象的声明可以指定数组类型因主要数组的存在与否而不同(8.3.4)。违反此规则的类型标识不需要诊断。
最后一句话意味着编译器和链接器不需要提供错误消息。直截了当是你的工作。
答案 1 :(得分:0)
在C ++中它不会链接,因为g
的类型在main.cpp和someOtherFile.cpp之间是不匹配的。您必须在someOtherFile.cpp中使用int g
或在main.cpp中使用extern RECT g;
。
在C中,这将编译和链接,但在c ++中。 Com编译并链接为c ++:
g++ -c someOtherFile.cpp
g++ -c main.cpp
g++ main.o someOtherFile.o -o test
或者,您可以使用以下功能:
<强>的main.cpp 强>
int g();
int main{
return g();
}
<强> someOtherFile.cpp 强>
#include<windows.h>
RECT r;
int g()
{
return (int)r;
}
显然不推荐(因为没有太多意义将RECT强制转换为int),但这与你想要做的事情类似。
g
内的变量someOtherFile.cpp
与main.cpp中声明的其他extern int g
无关。实际上,int g
根本没有在任何地方定义,因此链接器最终会失败。
显然,这实际上是通过g ++进行编译和链接,而microsoft链接器会因此类错误而出错。