error LNK2019: unresolved external symbol错误,解决

某次编写一个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搞定。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: error lnk2001: unresolved external symbol _getpriority 是一个与函数 getpriority 相关的链接错误。该错误表示在链接器阶段无法找到 getpriority 函数的定义。 getpriority 函数是用于获取进程或进程组的优先级的一个标准函数,该函数声明在头文件 #include <sys/resource.h> 。然而,由于某些原因,链接器无法找到该函数的定义,导致出现 unresolved external symbol 错误。 要解决此问题,可以按照以下步骤操作: 1. 确保在源代码正确地包含了 <sys/resource.h> 头文件。在 C/C++ 源文件的开头添加 #include <sys/resource.h>,以确保查找到正确的函数声明。 2. 检查编译器选项是否正确设置。有时,编译器选项可能需要手动指定以链接相应的库。对于 getpriority 函数,可能需要链接 librt 或 libpthread 库。可以尝试添加 -lrt 或 -lpthread 到编译器的选项。 3. 确保链接器能够找到 getpriority 函数的实现。实现该函数的库文件应该与编译器链接,以便在链接器阶段解决外部符号引用。这通常涉及到正确设置库文件的路径或将库文件添加到链接器的库路径。 总结:error lnk2001: unresolved external symbol _getpriority 是一个链接错误,表示编译器无法找到 getpriority 函数的定义。要解决此问题,需要确保正确包含头文件、正确设置编译器选项和链接库文件。 ### 回答2: error lnk2001: unresolved external symbol _getpriority是一个链接错误,意味着链接器无法解析对_getpriority的外部符号引用。 _getpriority是一个用于获取进程优先级的函数,它在Windows下没有定义,因此链接器无法找到它的定义。 要解决这个问题,可以采取以下几种方法: 1. 检查代码是否有对_getpriority函数的调用:首先检查代码是否存在对_getpriority函数的调用,如果没有必要使用该函数,可以删除相关的代码,这样可以避免链接错误。 2. 更改代码以使用Windows下的类似功能:如果确实需要使用进程优先级相关的功能,可以改用Windows下的类似函数来代替_getpriority。可以使用Windows API的GetPriorityClass函数来获取进程优先级,该函数返回一个整数值表示进程的优先级类别。 3. 添加相应的库文件:如果你确定代码需要使用_getpriority函数,可以找到包含该函数定义的库文件,并将其添加到链接器的库文件路径。可以通过在项目属性添加相应的附加库路径和库文件名称来实现。 总之,要解决error lnk2001: unresolved external symbol _getpriority链接错误,可以通过删除对_getpriority函数的调用、使用Windows API的相关函数或添加相应的库文件来解决问题。 ### 回答3: 这个错误是由于在C++代码使用了一个未解析的外部符号"getpriority"所引起的。"getpriority"是一个用于获取进程优先级的函数,属于POSIX标准库的一部分。 在C++,要使用"getpriority"函数,需要包含对应的头文件<sys/resource.h>,并且需要链接实现该函数的库文件。根据错误提示"error lnk2001: unresolved external symbol _getpriority",可以推断出缺少对应的库文件的链接。 解决这个问题可以按照以下步骤进行: 1. 确保正确地包含了头文件<sys/resource.h>: #include <sys/resource.h> 2. 确认编译器的选项是否正确地链接了对应的库文件。 对于使用GCC编译器的情况,需要添加"-l"参数指定链接的库文件名,例如: g++ main.cpp -o main -l库文件名 3. 如果是在Windows平台上开发,可能需要使用Cygwin或MinGW等工具链来编译和链接,以确保POSIX相关的功能可用。 此外,请注意确保包含正确的库文件,并将其放置在正确的位置,以便编译器能够找到并链接到正确的实现。 总之,"error lnk2001: unresolved external symbol _getpriority"错误是由于未能解析所需库文件的"getpriority"函数引起的。通过检查头文件和链接选项,以及在合适的位置放置正确的库文件,可以解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值