不能使用 FreeImagePlus 作为静态库

问题描述

我已成功链接到使用 FreeImage.2017.sln 中的 FreeImageLib 项目构建的静态 FreeImage 库。这是一个使用静态 FreeImage 库的示例:

#define FREEIMAGE_LIB

#include <iostream>
#include <FreeImage.h>

int main()
{
    FreeImage_Initialise();
    std::cout << "Version: " << FreeImage_GetVersion() << std::endl;
    FreeImage_DeInitialise();

    return 0;
}

链接静态库时需要上述#defineInitialise/DeInitialise方法。我还想静态链接到 FreeImagePlus 库。我已将 FreeImagePlus 项目配置类型更改为静态库并构建它。 FreeImagePlus 标头也使用 FREEIMAGE_LIB 宏,所以我使用了它。我还没有找到 FreeImagePlus 库的任何 Initialise/DeInitialse 方法。这是一个示例代码(应用程序链接到 FreeImagePlusd.lib):

#define FREEIMAGE_LIB

#include <FreeImagePlus.h>

int main()
{
    fipImage img;
    return 0;
}

我在构建该应用程序时遇到很多 LNK2019 和 LNK2001 错误,例如:

Error LNK2019 unresolved external symbol __imp_FreeImage_Allocate referenced in function "public: int __cdecl fipImage::combineChannels(class fipImage &,class fipImage &,class fipImage &)" (?combineChannels@fipImage@@QEAAHAEAV1@00@Z) C:\Workspace\MyProjects\TestCpp\out\build\x64-Debug\TestCpp C:\Workspace\MyProjects\TestCpp\out\build\x64-Debug\FreeImagePlusd.lib(fipImage.obj) 1    

如何使用 FreeImagePlus 作为静态库?

编辑

FreeImage source code

解决方法

我在 wsl ubunto 20.04 上对此进行了测试,编译了 FreeImagePlus 并使用以下内容编译了您的代码:

clang++ testfree.cpp -I/mnt/d/Codes/VC/FreeImage/Dist /mnt/d/Codes/VC/FreeImage/Dist/libfreeim
ageplus.a

它只是链接没有任何问题(只是有一些警告):

/usr/bin/ld: /mnt/d/Codes/VC/FreeImage/Dist/libfreeimageplus.a(strenc.o): in function `StrIOEncInit':
strenc.c:(.text+0xffa): warning: the use of `tmpnam' is dangerous,better use `mkstemp'

虽然我认为您的 C++ 代码也需要使用 FreeImage_Initialise();FreeImage_DeInitialise();