语言陷阱:armcc诡异的Error: L6218E

提前声明,我并未深入研究这个问题,只是觉得诡异而已。

今天在我的一个进行中的项目中,大量使用了array模板(源代码在之前的文章中有),在编译的时候出现了link错误:

Error: L6218E: Undefined symbol ARRAY::~ARRAY() (referred from XXX.o).

看了XXX.h文件,array.h已经添加,应该没有什么问题。使用的用法大概如下(精简后的结构,原始类比这个要复杂的多):

       #include "array.h"
       class XXX
       {
       public:
       XXX(){};
       virtual ~XXX(){};
       static ARRAY< ARRAY > getmatrix()
       {
       ARRAY< ARRAY > result;
       return result;
       }
       };
       

我原始类里面还有其他类型array模板类型,这里只是突出ARRAY,然后就出现了上面的那个错误。

以下是个人猜测出错的原因:

如果将ARRAY作为一个class T来看的话,T的析构函数~T()是不存在的,但~ARRAY则是存在的。所以那个错误的原因就明了了。(这是我刚才写这篇文章写到半截突然想到的。)

原因大概明白了,下面说解决的办法,很笨的解决办法(我目前只测试出这个有效):

在那个文件的任意位置(如果你不许使用静态或全局变量的话在类中间)声明一个无用的变量,当然,类型是ARRAY的(模板的中间的那串),然后就可以通过了。

我测试了其他的办法,比如typedef,声明之类的,都没有用。用的编译器是ADS1.2。

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你