如何在Linux(Ubuntu)中使用FreeImage库静态编译C/C++应用程序?

tod*_*tod 8 c c++ static-libraries freeimage static-linking

我正在关注这个例子.但是,我想为给定的玩具示例代码编译静态二进制文件.通常,我-static在编译期间使用但在此处它给出了错误消息.

编译命令工作正常:

g++ freeimagetest.cpp -o freeimagetest -lfreeimageplus
Run Code Online (Sandbox Code Playgroud)

编译命令不能正常工作:

g++ freeimagetest.cpp -o freeimagetest -lfreeimageplus -static
Run Code Online (Sandbox Code Playgroud)

错误消息的最后几行:

 In function `ZIPPreDecode':
(.text+0x6f8): undefined reference to `inflateReset'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libfreeimageplus.a(tif_zip.o): In function `ZIPSetupDecode':
(.text+0x783): undefined reference to `inflateInit_'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libfreeimageplus.a(tif_zip.o): In function `ZIPSetupDecode':
(.text+0x7b4): undefined reference to `deflateEnd'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

那么如何完成/修复呢?

编辑: 我看不到附加链接如何解决我的问题.显然,它看起来,由于错误消息,我试图静态编译它的方式存在一些问题.我找不到正确的方法.我认为错误信息是错误的 - 它只是以这些行结束(这些行不到所有消息的百分之一).任何做过它的人都可以更好地回答.如果您认为您的答案不仅仅是一个有根据的猜测,我会请求您在回答之前先试一试.如果您按照附件链接,只需几分钟.此外,我也标记了C因为C语言程序也是如此.

Hol*_*Cat 7

通常,当您静态链接库(而不是动态链接它)时,您还需要手动链接其所有依赖项.你需要弄清楚它缺少哪些库(依赖)并将其链接起来.

快速的谷歌搜索显示inflateReset来自一个名为的图书馆zlib.因此,您需要使用它来链接它-lz.您很可能已在编译器搜索目录中拥有此库,但如果不这样,则需要手动编译它.


tod*_*tod 6

以下是在Ubuntu上使用FreeImage库静态编译C/C++应用程序的步骤:

  1. 使用链接下载FreeImage的源代码分发.
  2. 下载并解压缩以获取FreeImage源目录.
  3. 在这个目录里面打开README.linux文件并阅读它.它有非常有用的信息.我建议不要错过它.
  4. README.linux文件还指导如何编译(静态和动态)并为C或C++安装此库.以下是关于C++:

构建FreeImagePlus

FreeImagePlus是FreeImage的C++包装器.要将FreeImage构建为C++库,请使用命令提示符输入FreeImage目录,并使用以下命令构建分发:

make -f Makefile.fip
Run Code Online (Sandbox Code Playgroud)

静态编译测试应用程序

一旦make完成,所需的文件都可以在里面Dist目录.

- libfreeimageplus.a:这是可以使用的静态库.

- FreeImagePlus.h:这是可用于包含的头文件.

只需将这两个文件复制到已放置示例C++文件(例如freeimagetest.cpp)的目录中.

使用以下命令在Ubuntu上使用FreeImage库静态编译C/C++应用程序:

g++ -static freeimagetest.cpp -L. -lfreeimageplus -o freeimagetest
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关创建和使用静态库的更多信息,可以在此处查看示例

这些步骤解决了我的问题.

请随时改进这个答案.