http://blog.163.com/aiding_001/blog/static/22908192011102224344450/

某次编写一个COM组件,接口定义好之后,增加了ZRX代码后编译链接,出现如下错误提示,百思不得其解。
error LNK2019: unresolved external symbol "public: enum Zcad::ErrorStatus __thiscall ZcDbDatabase::readDwgFile(char const *,int,bool,wchar_t const *)" (?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z) referenced in function "public: __thiscall ZwPdmAppSvr::ZwPdmAppSvr(char const *,bool)" (??0ZwPdmAppSvr@@QAE@PBD_N@Z)
 
寻遍百度谷歌大体的答案也就是库未包含或者配置不一致(其实这个问题根本上也是配置与ZRX库的配置不一致造成的)。但是肯定不是库包含的问题,因为其他的接口调用正常,唯独这个接口报链接错误。
如何定位是那个配置项呢?网上没有直接的答案,只好自己动手。
想来想去,应该还是连接器无法再lib中找到调用的函数,那么不如看看调用的函数在SDK中的声明:
Zcad::ErrorStatus readDwgFile(const ZCHAR* fileName, const int shmode = _SH_DENYWR, bool bAllowCPConversion = false, const wchar_t* wszPassword = NULL);
的确有这个函数的声明,那问题在哪里呢?
无奈之下看到了这个函数的修饰名:
?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z
不 如到ZRX.dll中去找找看有没有这个导出函数。用DEPENDS.EXE打开ZRX.dll,将所有导出函数拷贝到记事本中,然后查 找?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z,居然真的找不 到这个函数(不可能啊)。然后查找一下相似的函数,发现有一个函数与这个函数非常之相 似?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPBG@Z。
会不会就是这个函数呢?
用undname.exe还原一下这两个函数的声明试试。
C:\Program Files\Microsoft Visual Studio 9.0\VC>undname.exe ?readDwgFile@ZcDbDatabas
e@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPBG@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
 
Undecoration of :- "?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB
G@Z"
is :- "public: enum Zcad::ErrorStatus __thiscall ZcDbDatabase::readDwgFile(char
const *,int,bool,unsigned short const *)"
 
 
C:\Program Files\Microsoft Visual Studio 9.0\VC>undname.exe ?readDwgFile@ZcDbDatabas
e@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
 
Undecoration of :- "?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB
_W@Z"
is :- "public: enum Zcad::ErrorStatus __thiscall ZcDbDatabase::readDwgFile(char
const *,int,bool,wchar_t const *)"
 
细心的朋友一定已经发现,这两个函数其实就是同一个函数,差别就在最后一个参数上。这是由于编译器选项的不同导致连接器认为这两个函数不同。ZRX.dll中将wchar_t认为是自定义类型,编译后自动将其转换为unsigned short;
而我的工程中wchar_t设置为内置类型,按照这个类型得到的函数修饰名自然就与ZRX.lib中的函数名不同了,当然也就无法链接这个函数了。
 
真相终于大白,迅速打开工程设置,C/C++>Language将Treat wchar_t as Built-in Type设置为No (/Zc:wchar_t-)。
重新编译工程,链接通过,OK搞定。
 

链接报error LNK2019: unresolved external symbol错误,解决的更多相关文章

  1. FreeType的项目总是报error LNK2019: unresolved external symbol __imp错误

    用vs2013建立了一个c++的项目,然后在根目录放置了freetype.lib,将GitHub上面的include文件夹拷贝到本机,并且在VS中设置了额外包含目录指向这个inluce文件夹,然后将f ...

  2. VS2015 MSVCRTD.lib(_chandler4gs_.obj) : error LNK2019: unresolved external symbol __except_handler4_common referenced in function __except_handler4

    今天在VS2015中用编译好的QT5静态库打包软件,配置好QT的静态环境后, 发现报MSVCRTD.lib(_chandler4gs_.obj) : error LNK2019: unresolved ...

  3. error LNK2019:unresolved external symbol

    error LNK2019:unresolved external symbol 这个错误是指程序不认识函数.具体的说就是.h文件中定义并没有实现,这就是库出现了问题. 遇到这个问题,第一步就要看是哪 ...

  4. c++模板使用出错情况error LNK2019: unresolved external symbol "public: float __thiscall Compare<float>::min(void)" (?min@?$Compare@M@@QAEMXZ) referenced in function _main

    将类模板在头文件中定义,类的成员函数在头文件中声明,头文件中只留下接口,函数的实现在另一个.cpp文件中,这样编译出来错误error LNK2019: unresolved external symb ...

  5. C++ Error: error LNK2019: unresolved external symbol

    在某工程中新添加了文件x.cu与x.hpp,实现了一些功能,最后编译整个工程的时候就出现了这个问题: error LNK2019: unresolved external symbol 这是链接错误, ...

  6. Error LNK2019:Unresolved External Symbol 的解决方案

    当头文件中声明了一个函数,但是在相应的源文件中却没有对该函数进行定义,则会出现为“解决的外部符号”(unresolved external symbol )错误.另外,当一个函数调用了外部的一个库文件 ...

  7. Error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)"

    Error 2 error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToStr ...

  8. error LNK2019 : unresolved external symbol Zbar配置问题

    原文链接:https://blog.csdn.net/MengchiCMC/article/details/77871714 出现error LNK2019 : unresolved external ...

  9. C++ win32 dll 引用外部CLR,加载托管程序集异常-Error 10 error LNK2019: unresolved external symbol _CLRCreateInstancet

    异常: Error 10 error LNK2019: unresolved external symbol _CLRCreateInstance@12 referenced in function ...

随机推荐

  1. 动态设置 button的 name 的话 闪动的问题 解决

    其实 只要把  button设置成  custom 的  type 的话   就会 解决这个问题

  2. SQL中EXISTS怎么用[转]

    SQL中EXISTS怎么用 1 2 3 4 分步阅读 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 方法/步骤 1 EXISTS用于 ...

  3. SQL 查询性能优化----解决书签查找

    先来看看什么是书签查找: 当优化器所选择的非聚簇索引只包含查询请求的一部分字段时,就需要一个查找(lookup)来检索其他字段来满足请求.对一个有聚簇索引的表来说是一个键查找(key lookup), ...

  4. JS Encode and Decode URL

    1.Encode URL String var url = $(location).attr('href'); //get current url //OR var url = 'folder/ind ...

  5. python自省函数getattr的用法

    getattr是python里的一个内建函数 getattr()这个方法最主要的作用是实现反射机制.也就是说可以通过字符串获取方法实例.这样,你就可以把一个类可能要调用的方法放在配置文件里,在需要的时 ...

  6. python学习之——splinter使用

    开始学习使用splinter工具了,目前是摸索中,先熟悉splinter工具的使用方法~~ 实现功能: 打开firefox浏览器->www.baidu.com->输入关键词 python, ...

  7. jQuery插件编写笔记

    插件的种类: 1.封装对象方法的插件. 2.封装全局函数的插件. 3.选择器插件. *所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上. *在插件 ...

  8. C# 京东模拟登录小结

    最近有需要模拟京东登录,在解决过程中遇到了一些问题,因此这里记录下来避免以后遇到同样的问题. 首先第一步需要做的是找到登录请求网址和关于请求所需的一些信息.这里可以用抓取工具或者直接用firebug或 ...

  9. Java getResourceAsStream() 方法会缓存文件的问题

    xxx.getClass().getClassLoader().getResourceAsStream("d:/test-config.properties") 这方法确实会缓存文 ...

  10. MMS彩信字符集(字符编码)

    彩信字符集在CharacterSets类中定义 android\frameworks\opt\telephony\src\java\com\google\android\mms\pdu\Charact ...