libpng函数调用都是未解析的外部符号

时间:2016-06-30 06:02:42

标签: c++ c dll linker libpng

我正在尝试将我的项目与libpng版本1.6.23 dll库链接,但我的链接器只看到我作为未解析的外部符号对其进行的所有函数调用。我正在使用Visual Studio Express 2013.这是链接器输出的片段。

1>PNGUtils.obj : error LNK2019: unresolved external symbol png_set_sig_bytes referenced in function "public: static void * __cdecl PNGUtils::Read(char const *,unsigned int &,unsigned int &,int &)" (?Read@PNGUtils@@SAPEAXPEBDAEAI1AEAH@Z)
1>PNGUtils.obj : error LNK2019: unresolved external symbol png_sig_cmp referenced in function "private: static bool __cdecl PNGUtils::Validate(struct _iobuf *)" (?Validate@PNGUtils@@CA_NPEAU_iobuf@@@Z)
1>PNGUtils.obj : error LNK2019: unresolved external symbol png_create_read_struct referenced in function "public: static void * __cdecl PNGUtils::Read(char const *,unsigned int &,unsigned int &,int &)" (?Read@PNGUtils@@SAPEAXPEBDAEAI1AEAH@Z)
1>PNGUtils.obj : error LNK2019: unresolved external symbol png_set_longjmp_fn referenced in function "public: static void * __cdecl PNGUtils::Read(char const *,unsigned int &,unsigned int &,int &)" (?Read@PNGUtils@@SAPEAXPEBDAEAI1AEAH@Z)
1>PNGUtils.obj : error LNK2019: unresolved external symbol png_create_info_struct referenced in function "public: static void * __cdecl PNGUtils::Read(char const *,unsigned int &,unsigned int &,int &)" (?Read@PNGUtils@@SAPEAXPEBDAEAI1AEAH@Z)
1>PNGUtils.obj : error LNK2019: unresolved external symbol png_read_info referenced in function "public: static void * __cdecl PNGUtils::Read(char const *,unsigned int &,unsigned int &,int &)" (?Read@PNGUtils@@SAPEAXPEBDAEAI1AEAH@Z)
1>PNGUtils.obj : error LNK2019: unresolved external symbol png_set_expand_gray_1_2_4_to_8 referenced in function "public: static void * __cdecl PNGUtils::Read(char const *,unsigned int &,unsigned int &,int &)" (?Read@PNGUtils@@SAPEAXPEBDAEAI1AEAH@Z)

我正在与其他库如lua和glew成功连接,据我所知,在尝试链接到libpng时没有什么不同。

奇怪的是,当我将链接器置于详细模式时。它声明......

1>  Finished searching libraries
1>  
1>  Unused libraries:
1>    libs\png\libpng16.lib

链接器似乎声称我没有使用libpng库,即使我在PNGUtils.cpp读取方法中明确调用其代码段中的函数。

png_structp pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!pngPtr)
{
    LOG(LOG_CHANNEL_ERROR, "PNGUtils: Couldn't initialize png read struct");

    fclose(fp);

    return NULL;
}

png_infop infoPtr = png_create_info_struct(pngPtr);
if (!infoPtr) 
{
    LOG(LOG_CHANNEL_ERROR, "PNGUtils: Couldn't initialize png info struct");
    png_destroy_read_struct(&pngPtr, (png_infopp)0, (png_infopp)0);

    fclose(fp);

    return NULL;
}

我觉得链接器似乎忽略了对libpng的函数调用。我很乐意听到任何想法或答案,当然更愿意根据要求提供更多信息。

2 个答案:

答案 0 :(得分:1)

确保您的项目和libpng.dll是使用的 相同的设置,如libpng附带的projects / vstudio / README.txt中所述:

  

警告   ======= Libpng 1.6.x在使用时不使用默认的运行时库   构建libpng的静态库构建;而不是共享的DLL   运行时它使用静态运行时。如果你需要改变这个品牌   一定要改变所有相关项目的设置:

libpng
zlib
all the test programs
     

每个构建的运行时库设置如下:

           Release        Debug
DLL         /MD            /MDd
Library     /MT            /MTd
     

注意libpng 1.5.x错误地使用/ MD用于调试DLL构建;如果   您在应用程序中使用了调试版本,并且您更改了要使用的应用程序   / MD你需要将它改回到/ MDd for libpng 1.6.0和   后面。

     

Visual Studio 2010默认为Win32 DLL或静态库   项目如下:

                 Release     Debug
DLL               /MD         /MDd
Static Library    /MD         /MDd
     

另外,请务必同时构建libpng,zlib和您的项目   平台(例如,32位或64位)。

答案 1 :(得分:0)

c我知道这个问题有点老了,但也许有人有同样的困难。

就我而言,解决“未解析链接”(使用 Visual Studio 16.4.6 2019)问题的 2 个步骤是:

  • 将我的项目编译为 x86(因为我使用的库是在此架构下构建的)并使用 32 位版本的 libpng .dll
  • 添加zlib(包括代码中的zlib.h并链接对应的.dll和.lib)

这样做后,它编译成功。