最近在编译项目的时候,出现的multiple definition的错误。仔细排查了.h文件的define定义等,最后发现是自己定义类的时候写法有问题。因为这个问题浪费了很长时间,所以特别记在这里。
做测试如下:
新建一个目录firstdef,在其中创建文件firstdef.h,代码如下:

对应建立firstdef.cpp,代码如下:

对应编译成lib库的makefile如下:

编译结果如下:

之后在与firstdef目录平级的地方创建文件test.cpp:

makefile如下:

编译结果如下:

由此可见,对比Show和Test函数可以发现,Show报错而Test却没有报错。
对于公司同事说如果不用lib而是直接编译.o的话就不会出错,我单独测试了一下,makefile如下:

编译结果如下:

但是如果将Show设置为内联,则上面两种方法的编译就都没有问题了。
如:

有不少的教程都会将函数的实现写在头文件中,如此看来,还真是会给读者们造成许多误读啊。

另附:源代码下载,需要的朋友可以自己研究一下。

以上代码均在windows下g++ 3.4.5编译通过。

暂无相关产品

5则回应给“有关最近GCC编译出现的multiple definition问题”

  1. 瑞士菜刀说道:

    firstdef.h 里的 void Show() 应该写成 void CFirstDef::Show() 才是 CFirstDef 的成员函数,否则只是定义了一个普通的函数。

    所以,之所以会有重复定义问题:firstdef.cpp 文件 include 了 firstdef.h 后,在 firstdef.o 里会产生一份 void Show()。而 test.cpp 文件 include 了 firstdef.h,编译生成的 test.o 里也有一份 void Show(),自然就 multiple definition 了。

    [回复]

    Dante 回复:

    这样一想的话,确实容易理解很多呢~ 呵呵

    [回复]

    Terrence 回复:

    对呀对呀,那个Show没加类作用域的嘛。

    [回复]

  2. zzg_china说道:

    赞成菜刀的说法,深入透彻。

    [回复]

    Dante 回复:

    嗯,确实如此,firstdef.h文件里面的那个show函数是我不小心写错了。。

    [回复]

发表评论