1

我有一个与调用 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 

似乎没有导出任何符号。

4

2 回答 2

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)
于 2013-05-10T10:57:02.907 回答
0

根据讨论,我意识到我的程序的错误在于某些功能没有正确定义。在某些库中,可能会在头文件中使用关键字“ extern”声明函数。但是,函数的实现是在另一个文件中定义的,在构建库时可以将其排除。正如@praks411 所解释的,函数调用转换是另一种情况,当您遇到相同问题时应该考虑这种情况。

于 2013-05-10T14:15:41.347 回答