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


“符号未定义”链接错误

    “符号未定义”链接错误,如VC6.0的L2001,其描述一般是“不可解析的外部符号(unresolved external symbol)”,通常是由于函数实现或全局变量定义不存在或未被编译链接而形成的,具体原因及解决方法有:
    未链接静态库或动态库
    桩代码遗漏
    常规方法不能解决的符号未定义链接错误
    如果编译器为VC系列,对于不易解决的“符号重定义”和“符号未定义”链接错误,可以在工程属性的链接命令行中添加“/FORCE”,忽略此类错误。
 

原因一:未链接静态库或动态库
    一般来说,产品项目链接的静态库,测试工程也要链接,方法是从产品工程的setting中,拷贝需要链接的库列表到工程属性->链接->链接以下库。库名之间用,分隔。产品工程setting中库列表的位置:
    VC6.0: Project -> Settings,点击“Link”标签,“Category”下拉列表选择“Input”,“Object/library modules”输入框中即为库列表;
    VC2003及以上版本:项目 -> 属性,左边树形控件中选择 配置属性->链接器->输入,“附加依赖项”输入框中即为库列表;
    CodeBlocks:Project -> Build options,“Linker settings”中的内容中即为库列表。
    另外,凡是设为“L”的头文件(可在“工程属性”的“头文件”页,点击“详细分类”,打开“头文件分类”对话框查看),VU都不会自动生成桩,测试工程需链接相应的静态库(.Lib)或动态库(.Dll)。动态库通常由代码完成链接,不需要设置,静态库则需手工添加。如果仍有部分库函数链接错误,请查看文档(如MSDN),找出这些库函数所在的lib并加入。

原因二:桩代码遗漏
   
偶尔会因桩代码遗漏造成“符号未定义”链接错误,可以用“桩代码管理器”补齐桩代码。VU不会为未声明的函数或只在函数体内声明的函数生成桩,应尽量在函数体外声明。请参考桩代码管理器

常规方法不能解决的符号未定义链接错误
    以下错误比较少见:
    1、使用桩代码管理器生成的桩代码产生编译错误:从链接错误中拷贝的函数声明有可能生成错误的桩函数声明,可找出原始声明替换。
    2、提示“符号未定义”,但添加桩代码后却提示“函数已有函数体”:通常是导出类的内联函数产生此类问题,目前无法直接解决,可将产生错误的源文件移除,如 CCHelper.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall CThread::Stop(void),可将CChelper.cpp移除。方法是:1)在工程属性中将产生错误的源文件设为X;2)从代码菜单执行“刷新桩代码”。
    3、导出类的静态成员产生“符号未定义”错误,添加桩代码后又产生编译错误,此问题目前无法直接解决,可按2的方法将产生错误的源文件移除。如:CJDockBar.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static struct AFX_MSGMAP const CDockBar::messageMap,可将CJDockBar.cpp移除。
    4、使用桩代码管理器生成桩代码失败:可在__Customize.c/cpp文件中自行编写桩代码。