C/C++单元测试工具Visual Unit 4在线帮助


“符号重定义”链接错误

    “符号重定义”链接错误,如VC6.0的L2005,错误描述一般是“符号xxx已在模块xxx定义”,一般是由于函数有多个实现或全局变量重复定义形成的。
    如果编译器为VC系列,对于不易解决的“符号重定义”和“符号未定义”链接错误,可以在测试工程的链接选项命令行中添加“/FORCE”,忽略此类错误。

原因一:用于引入动态库的头文件未设为“L”
    凡是设为“H”的头文件(可在“工程属性”的“头文件”页,点击“详细分类”,打开“头文件分类”对话框查看),VU都会自动生成桩。动态库通常在产品代码中已存在链接代码,会自动链接,从而造成重定义错误。解决办法:
    在“工程属性”的“头文件”页,点击“详细分类”,打开“头文件分类”对话框,将用于引入动态库或静态库的头文件设为“L”。

原因二:缺省链接库的顺序不对导致链接错误 
    例如,VC6.0报告以下链接错误:
    nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMT.lib(new.obj)
    原因是nafxcw.lib本应在前链接,但缺省顺序不对。
    解决办法:显式指定链接静态库nafxcw.lib(或nafxcwd.lib,LIBCMT.lib对应nafxcw.lib,LIBCMTD.lib对应nafxcwd.lib),这样就会首先链接nafxcw.lib,链接静态库的方法 :在工程属性->链接->链接以下库最前面,输入要链接的库,用,分隔。请参考“符号未定义”链接错误

原因三:VU生成了多余桩
    解决办法:在“桩代码管理器”中搜索出多余桩并屏蔽当前版本此种错误已极少出现。

原因四:main函数冲突
    一个工程只能有一个main函数,测试工程本身有一个main函数,因此,如果被测试代码中含有main函数,会产生冲突。
   
    推荐的解决办法是:在“工具”菜单,选择“设定”,在“功能”页,选中“转定义main函数”,然后Rebuild All。
   
    在极少数情形下,转定义main函数可能产生编译错误,这时,要取消转定义,并用以下办法之一不测试main函数:
    a.在 工程属性->测试目标,将含有main函数的文件设为X。
    b.在产品代码的main函数前后加上编译条件,语法如下:
    #ifndef _VUNIT
    int main()
    {
        ...
    }
    #endif