• 链接报error LNK2019: unresolved external symbol错误,解决


    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 FilesMicrosoft Visual Studio 9.0VC>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 FilesMicrosoft Visual Studio 9.0VC>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搞定。
     
  • 相关阅读:
    jcmd的简单实用
    ConfigMap介绍
    Okhttp3基本使用
    Spring中的@Transactional(rollbackFor = Exception.class)属性详解
    正则表达式中/i,/g,/ig,/gi,/m的区别和含义
    事务日志已满,原因为“ACTIVE_TRANSACTION”
    Windows Server查看和记录远程登录信息的方法
    Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
    将float转换为数据类型numeric时出现算术溢出错误
    java对redis的基本操作
  • 原文地址:https://www.cnblogs.com/gxh973121/p/3888391.html
Copyright © 2020-2023  润新知