我有一个与调用C ++库有关的问题。该库的编译是成功的。之后,该库由普通的可执行程序调用。但是,会发生一些链接错误。我举一个例子来说明我的问题。
我已下载旧版本的TIFF库(版本3.6.1),然后将其编译为静态库:tiff.lib
。之后我写了一个可执行程序,通过调用库来读写TIFF文件。但是,会出现以下错误:
2>tiff.lib(tif_jpeg.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_lzw.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_dirinfo.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_luv.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_pixarlog.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_zip.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_dirwrite.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_write.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
2>tiff.lib(tif_dirread.obj) : error LNK2001: unresolved external symbol __TIFFmalloc
我无法理解为什么我会收到链接错误,因为tiff.lib
已成功构建,并且我的可执行程序也已成功链接。如果tiff.lib
有问题,我希望在构建lib时,在编译和链接过程中会出现链接错误。任何想法将不胜感激!
编辑:我添加一些细节以便找到解决方案。 tiff.lib
是作为静态库构建的,当我使用dumpbin.exe /exports tiff.lib
显示库中导出的所有定义时,会给出以下消息:
Dump of file tiff.lib
File Type: LIBRARY
Summary
3B8 .bss
9405 .data
D5640 .debug$S
C38 .debug$T
C4E .drectve
19E79 .rdata
84 .rtc$IMZ
84 .rtc$TMZ
3363E .text
似乎没有导出符号。
答案 0 :(得分:3)
我认为tiff.lib是C库,你用c ++进行链接。所以我想你需要使用extern“C”来包含它的头文件.h文件。
extern "C"
{
#include<tiff.h>
}
上面的例子只是一个例子。还要确保在c ++项目的项目属性页中设置正确的调用约定
C/C++ ----------> Advanced ---------->Call Convention--->_cdecl(/Gd) //Set only if required
C/C++----------->Advanced------------>Compile As----->C++ Code(/TP)
答案 1 :(得分:0)
根据讨论,我逐渐意识到我的程序错误在于某些功能尚未正确定义。可能会发生在某些库中,可以在头文件中使用关键字“extern
”声明该函数。但是,该函数的实现在另一个文件中定义,在构建库时可以将其排除。函数调用转换,如@ praks411所解释的,是另一种情况,当您遇到同样的问题时应该考虑。