linux FreeImage安装编译

举报
风吹稻花香 发表于 2021/06/05 00:00:18 2021/06/05
【摘要】 原文:http://www.cnblogs.com/oloroso/p/5777959.html FreeImage编译及遇到问题解决 1、下载freeImage源码包 wget http://downloads.sourceforge.net/freeimage/FreeImage3170.zip#解压unzip FreeImage3170.zip -d freeI...

原文:http://www.cnblogs.com/oloroso/p/5777959.html

FreeImage编译及遇到问题解决

1、下载freeImage源码包


  
  1. wget http://downloads.sourceforge.net/freeimage/FreeImage3170.zip
  2. #解压
  3. unzip FreeImage3170.zip -d freeImage

2、Linux下编译

cd freeImage

sudo make

2.1、类型转换错误

这个问题出现在dcraw_common.cpp这个文件中的45224543行之间。
报错信息如下


  
  1. Source/LibRawLite/./internal/dcraw_common.cpp: 在成员函数‘void LibRaw::vng_interpolate()’中:
  2. Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘128’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]
  3. };
  4. ^
  5. Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘136’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]
  6. Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘128’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]
  7. Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘136’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]
  8. Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘128’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]
  9. Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘136’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]

我们把有问题的这段代码摘出来,可以看到{}中以十六进制表示的数字,有的是超过127的,因为字面整数默认是int类型,所以这里会出现这个错误。


   
  1. void CLASS vng_interpolate()
  2. {
  3. static const signed char *cp, terms[] = {
  4. -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01,
  5. -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01,
  6. -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03,
  7. -2,+1,-1,+0,0,0x04, -2,+1,+0,-1,1,0x04, -2,+1,+0,+0,0,0x06,
  8. -2,+1,+0,+1,0,0x02, -2,+2,+0,+0,1,0x04, -2,+2,+0,+1,0,0x04,
  9. -1,-2,-1,+0,0,0x80, -1,-2,+0,-1,0,0x01, -1,-2,+1,-1,0,0x01,
  10. -1,-2,+1,+0,1,0x01, -1,-1,-1,+1,0,0x88, -1,-1,+1,-2,0,0x40,
  11. -1,-1,+1,-1,0,0x22, -1,-1,+1,+0,0,0x33, -1,-1,+1,+1,1,0x11,
  12. -1,+0,-1,+2,0,0x08, -1,+0,+0,-1,0,0x44, -1,+0,+0,+1,0,0x11,
  13. -1,+0,+1,-2,1,0x40, -1,+0,+1,-1,0,0x66, -1,+0,+1,+0,1,0x22,
  14. -1,+0,+1,+1,0,0x33, -1,+0,+1,+2,1,0x10, -1,+1,+1,-1,1,0x44,
  15. -1,+1,+1,+0,0,0x66, -1,+1,+1,+1,0,0x22, -1,+1,+1,+2,0,0x10,
  16. -1,+2,+0,+1,0,0x04, -1,+2,+1,+0,1,0x04, -1,+2,+1,+1,0,0x04,
  17. +0,-2,+0,+0,1,0x80, +0,-1,+0,+1,1,0x88, +0,-1,+1,-2,0,0x40,
  18. +0,-1,+1,+0,0,0x11, +0,-1,+2,-2,0,0x40, +0,-1,+2,-1,0,0x20,
  19. +0,-1,+2,+0,0,0x30, +0,-1,+2,+1,1,0x10, +0,+0,+0,+2,1,0x08,
  20. +0,+0,+2,-2,1,0x40, +0,+0,+2,-1,0,0x60, +0,+0,+2,+0,1,0x20,
  21. +0,+0,+2,+1,0,0x30, +0,+0,+2,+2,1,0x10, +0,+1,+1,+0,0,0x44,
  22. +0,+1,+1,+2,0,0x10, +0,+1,+2,-1,1,0x40, +0,+1,+2,+0,0,0x60,
  23. +0,+1,+2,+1,0,0x20, +0,+1,+2,+2,0,0x10, +1,-2,+1,+0,0,0x80,
  24. +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40,
  25. +1,+0,+2,+1,0,0x10
  26. }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 };

将上面的代码改为下面的形式即可


   
  1. void CLASS vng_interpolate()
  2. {
  3. static const signed char *cp, terms[] = {
  4. -2,-2,+0,-1,0,(char)0x01, -2,-2,+0,+0,1,(char)0x01, -2,-1,-1,+0,0,(char)0x01,
  5. -2,-1,+0,-1,0,(char)0x02, -2,-1,+0,+0,0,(char)0x03, -2,-1,+0,+1,1,(char)0x01,
  6. -2,+0,+0,-1,0,(char)0x06, -2,+0,+0,+0,1,(char)0x02, -2,+0,+0,+1,0,(char)0x03,
  7. -2,+1,-1,+0,0,(char)0x04, -2,+1,+0,-1,1,(char)0x04, -2,+1,+0,+0,0,(char)0x06,
  8. -2,+1,+0,+1,0,(char)0x02, -2,+2,+0,+0,1,(char)0x04, -2,+2,+0,+1,0,(char)0x04,
  9. -1,-2,-1,+0,0,(char)0x80, -1,-2,+0,-1,0,(char)0x01, -1,-2,+1,-1,0,(char)0x01,
  10. -1,-2,+1,+0,1,(char)0x01, -1,-1,-1,+1,0,(char)0x88, -1,-1,+1,-2,0,(char)0x40,
  11. -1,-1,+1,-1,0,(char)0x22, -1,-1,+1,+0,0,(char)0x33, -1,-1,+1,+1,1,(char)0x11,
  12. -1,+0,-1,+2,0,(char)0x08, -1,+0,+0,-1,0,(char)0x44, -1,+0,+0,+1,0,(char)0x11,
  13. -1,+0,+1,-2,1,(char)0x40, -1,+0,+1,-1,0,(char)0x66, -1,+0,+1,+0,1,(char)0x22,
  14. -1,+0,+1,+1,0,(char)0x33, -1,+0,+1,+2,1,(char)0x10, -1,+1,+1,-1,1,(char)0x44,
  15. -1,+1,+1,+0,0,(char)0x66, -1,+1,+1,+1,0,(char)0x22, -1,+1,+1,+2,0,(char)0x10,
  16. -1,+2,+0,+1,0,(char)0x04, -1,+2,+1,+0,1,(char)0x04, -1,+2,+1,+1,0,(char)0x04,
  17. +0,-2,+0,+0,1,(char)0x80, +0,-1,+0,+1,1,(char)0x88, +0,-1,+1,-2,0,(char)0x40,
  18. +0,-1,+1,+0,0,(char)0x11, +0,-1,+2,-2,0,(char)0x40, +0,-1,+2,-1,0,(char)0x20,
  19. +0,-1,+2,+0,0,(char)0x30, +0,-1,+2,+1,1,(char)0x10, +0,+0,+0,+2,1,(char)0x08,
  20. +0,+0,+2,-2,1,(char)0x40, +0,+0,+2,-1,0,(char)0x60, +0,+0,+2,+0,1,(char)0x20,
  21. +0,+0,+2,+1,0,(char)0x30, +0,+0,+2,+2,1,(char)0x10, +0,+1,+1,+0,0,(char)0x44,
  22. +0,+1,+1,+2,0,(char)0x10, +0,+1,+2,-1,1,(char)0x40, +0,+1,+2,+0,0,(char)0x60,
  23. +0,+1,+2,+1,0,(char)0x20, +0,+1,+2,+2,0,(char)0x10, +1,-2,+1,+0,0,(char)0x80,
  24. +1,-1,+1,+1,0,(char)0x88, +1,+0,+1,+2,0,(char)0x08, +1,+0,+2,-1,0,(char)0x40,
  25. +1,+0,+2,+1,0,(char)0x10
  26. }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 };

2.2 C++11的原始字符串与宏定义R产生的错误

这个错误是因为gcc 5.4这里支持的是C++ 11的标准,C++11中引入了原始字符串的新特性,使用R""方式来定义一个不进行转义的字符串。而在FreeImage的一些代码中,使用了R作为一些宏函数的参数,导致一些场合会将其当做是一个原始字符串。

先来看一下报错信息


  
  1. Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:34: 错误:原始字符串分隔符中有无效字符‘ ’
  2. "shll_s.w %["#R"], %["#R"], 9 \n\t" \
  3. ^
  4. Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:48: 错误:原始字符串分隔符中有无效字符‘ ’
  5. "shll_s.w %["#R"], %["#R"], 9 \n\t" \
  6. ^
  7. Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:40:34: 错误:原始字符串分隔符中有无效字符‘ ’
  8. "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \
  9. ^
  10. Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:40:48: 错误:原始字符串分隔符中有无效字符‘ ’
  11. "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \
  12. ^
  13. Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:43:34: 错误:原始字符串分隔符中有无效字符‘ ’
  14. "srl %["#R"], %["#R"], 24 \n\t" \
  15. ^
  16. Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:43:48: 错误:原始字符串分隔符中有无效字符‘ ’
  17. "srl %["#R"], %["#R"], 24 \n\t" \

报错的文件是dsp.upsampling_mips_dsp_r2.c。这是一个.c的文件,使用gcc编译也会出现这个错误。

报错的代码如下(dsp.upsampling_mips_dsp_r2.c 22-49)


   
  1. #if !defined(WEBP_YUV_USE_TABLE)
  2. #define YUV_TO_RGB(Y, U, V, R, G, B) do { \
  3. const int t1 = kYScale * Y; \
  4. const int t2 = kVToG * V; \
  5. R = kVToR * V; \
  6. G = kUToG * U; \
  7. B = kUToB * U; \
  8. R = t1 + R; \
  9. G = t1 - G; \
  10. B = t1 + B; \
  11. R = R + kRCst; \
  12. G = G - t2 + kGCst; \
  13. B = B + kBCst; \
  14. __asm__ volatile ( \
  15. "shll_s.w %["#R"], %["#R"], 9 \n\t" \
  16. "shll_s.w %["#G"], %["#G"], 9 \n\t" \
  17. "shll_s.w %["#B"], %["#B"], 9 \n\t" \
  18. "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \
  19. "precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \
  20. "precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \
  21. "srl %["#R"], %["#R"], 24 \n\t" \
  22. "srl %["#G"], %["#G"], 24 \n\t" \
  23. "srl %["#B"], %["#B"], 24 \n\t" \
  24. : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \
  25. : \
  26. ); \
  27. } while (0)

上面代码中的第16行起,有多处是R"],的形式。这里编译器会将其当做一个原始字符串,从而导致错误。
做如下修改,将所有的R都使用Red替代。


   
  1. #if !defined(WEBP_YUV_USE_TABLE)
  2. #define YUV_TO_RGB(Y, U, V, Red, G, B) do { \
  3. const int t1 = kYScale * Y; \
  4. const int t2 = kVToG * V; \
  5. Red = kVToR * V; \
  6. G = kUToG * U; \
  7. B = kUToB * U; \
  8. Red = t1 + Red; \
  9. G = t1 - G; \
  10. B = t1 + B; \
  11. Red = Red + kRCst; \
  12. G = G - t2 + kGCst; \
  13. B = B + kBCst; \
  14. __asm__ volatile ( \
  15. "shll_s.w %["#Red"], %["#Red"], 9 \n\t" \
  16. "shll_s.w %["#G"], %["#G"], 9 \n\t" \
  17. "shll_s.w %["#B"], %["#B"], 9 \n\t" \
  18. "precrqu_s.qb.ph %["#Red"], %["#Red"], $zero \n\t" \
  19. "precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \
  20. "precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \
  21. "srl %["#Red"], %["#Red"], 24 \n\t" \
  22. "srl %["#G"], %["#G"], 24 \n\t" \
  23. "srl %["#B"], %["#B"], 24 \n\t" \
  24. : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \
  25. : \
  26. ); \
  27. } while (0)

这个错误还会出现在Source/LibWebP/./src/dsp/dsp.yuv_mips_dsp_r2.c文件中,修改的方式是一样的。

2.3 tmpnam与mkstemp的选择

这并不是一个错误,只是一个警告。


  
  1. Source/LibJXR/./image/encode/strenc.o:在函数‘StrIOEncInit’中:
  2. strenc.c:(.text+0x17cc): 警告: the use of `tmpnam' is dangerous, better use `mkstemp'

tmpnam函数是危险的,建议使用mkstemp。原因是mkstemp调用完成后,就已经生成并打开了一个临时文件,而tmpnam只是生成了一个临时文件的文件名,并没有创建文件,不能保证其一定不存在!!!
这里就不做修改了。

2.4 安装到指定目录

sudo make install 默认在usr/lib目录下面。

我们可以使用如下命令指定安装目录。


  
  1. > sudo make DESTDIR=/home/o/code/freeimage install
  2. [sudo] o 的密码:
  3. make -f Makefile.gnu install
  4. make[1]: Entering directory '/media/o/work/development_library/FreeImage'
  5. install -d /home/o/code/freeimage/usr/include /home/o/code/freeimage/usr/lib
  6. install -m 644 -o root -g root Source/FreeImage.h /home/o/code/freeimage/usr/include
  7. install -m 644 -o root -g root libfreeimage.a /home/o/code/freeimage/usr/lib
  8. install -m 755 -o root -g root libfreeimage-3.17.0.so /home/o/code/freeimage/usr/lib
  9. ln -sf libfreeimage-3.17.0.so /home/o/code/freeimage/usr/lib/libfreeimage.so.3
  10. ln -sf libfreeimage.so.3 /home/o/code/freeimage/usr/lib/libfreeimage.so
  11. make[1]: Leaving directory '/media/o/work/development_library/FreeImage'

到安装目录下查看一下


  
  1. /home/o/code/freeimage/usr [o@o-pc] [12:05]
  2. > tree
  3. .
  4. ├── include
  5. │   └── FreeImage.h
  6. └── lib
  7. ├── libfreeimage-3.17.0.so
  8. ├── libfreeimage.a
  9. ├── libfreeimage.so -> libfreeimage.so.3
  10. └── libfreeimage.so.3 -> libfreeimage-3.17.0.so
  11. 2 directories, 5 files

3、VS2015进行编译

我当前下载的版本,里面没有带VS2015的工程文件。但是有VS2005/2008/2013的。

直接使用VS2015打开源码目录下的FreeImage.2013.sln文件,然后升级 VC++ 编译器和库

3.1 源码的修改

1、将文件tif_config.h中的


   
  1. #ifdef _WIN32
  2. #define snprintf _snprintf // 将此行注释掉
  3. #define lfind _lfind
  4. #endif // _WIN32

修改为


   
  1. #ifdef _WIN32
  2. //#define snprintf _snprintf
  3. #define lfind _lfind
  4. #endif // _WIN32

早期的VC自带的C标准库中确实没有snprintf这个函数,只有_snprintf。但是VS2015下是有的,所以这里不注释掉会有重定义的问题。
也可以修改为


   
  1. #ifdef _WIN32
  2. #if defined(_MSC_VER) && _MSC_VER < 1900
  3. #define snprintf _snprintf
  4. #endif
  5. #define lfind _lfind
  6. #endif // _WIN32

3.2 编译和生成

Dist FreeImage.h

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/60139468

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。