【问题标题】:libpng function calls are all unresolved external symbolslibpng 函数调用都是未解析的外部符号
【发布时间】:2016-11-02 01:47:45
【问题描述】:

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

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 的函数调用感到困惑。我很乐意听到任何想法或答案,当然也非常愿意应要求提供更多信息。

【问题讨论】:

  • 我认为“未使用的库”部分意味着链接器在创建目标文件/可执行文件时忽略了该库。你必须找出原因。

标签: c++ c dll linker libpng


【解决方案1】:

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

在我的情况下,解决“未解决的链接”(使用 Visual Studio 16.4.6 2019)问题的 2 个步骤是:

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

完成后,编译成功。

【讨论】:

    【解决方案2】:

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

    警告 ======= Libpng 1.6.x 不使用默认运行时库时 构建 libpng 的静态库;而不是共享 DLL 运行时它使用静态运行时。如果您需要更改此 make 确保更改所有相关项目的设置:

    libpng
    zlib
    all the test programs
    

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

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

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

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

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

    另外,请确保构建 libpng、zlib 和您的项目都是为了相同的 平台(例如,32 位或 64 位)。

    【讨论】:

    • 我确信这是朝着正确方向迈出的一步,感谢您指出这一点。我最终通过将 libpng 源代码编译为 64 位来修复它,因为我的项目是 64 位的。错误现在消失了。
    • 我会将它(大约 32 位和 64 位)添加到 libpng 文档中。
    • 感谢您的回答。这里只是一个新手问题。如何更改 Visual Studio 中的运行时库设置?我无法按照您的建议更改调试、DLL ---> /MDd 和库 --> MTd。目前只在“Configuration Properties --> C/C++ --> Code Generation”中找到“*Runtime Library”
    猜你喜欢
    • 2013-11-03
    • 2017-10-30
    • 1970-01-01
    • 2011-07-08
    • 2014-04-20
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多