关于FreeImage的linux版本编译
来源:互联网 发布:大数据开发面试题 编辑:程序博客网 时间:2024/05/22 12:25
最近在搞opencl在FPGA上的编程,所以要处理图像,还是要靠FreeImage库。从官网来看,只提供了windows版本的动态和静态库。由于我的altera cyclone V(de1soc)板需要运行的是linux库,无奈只好自己编译了。
我的编译环境:
(1)Ubuntu16.04:32位(这要根据系统选择)
(2)arm编译器:gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar(好不容易从网上找到这个版本的编译器,这个是跟我的板子所用的库的版本一样)接下来要安装arm编译器,配置环境变量,总之能用arm编译器就行了,这里就不多说了。
(3)从FreeImage官网上下载FreeImage源码包(FreeImage3170.zip),上传到linux系统上,解压。
(4)开始编译:
进入FreeImage的解压目录下,可以看到有很多版本的Makefile文件。默认使用的是Makefile.gnu,当直接执行make时所用的是Makefile(默认执行Makefile.gnu),也可以手动指定Makefile文件(通过make -f xxxx 命令)。
若直接执行make,这时默认使用的是系统自带的gcc和g++编译器。编译完成后执行 make install,make clean 可以进行安装clean。
这时你的linux系统就可以像使用C语言库一样使用FreeImage的函数和库了。
若使用arm版本的编译器则需要修改Makefile.gnu文件把编译器改成arm版。将Makefile.gnu备份成Makefile.gnu.arm然后修改
Makefile.gnu.arm如下:
修改完成之后执行 make -f Makefile.gnu.arm 编译完成之后生成的库文件在Dist目录下。然后就可以加入到你的工程中了。
编译过程中可能遇到的问题:
(1)这个问题出现在dcraw_common.cpp这个文件中的4522到4543行之间。报错信息如下
Source/LibRawLite/./internal/dcraw_common.cpp: 在成员函数‘void LibRaw::vng_interpolate()’中:Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘128’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing] }; ^Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘136’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘128’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘136’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘128’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]Source/LibRawLite/./internal/dcraw_common.cpp:4546:3: 错误:在 {} 内将‘136’从‘int’转换为较窄的类型‘signed char’ [-Wnarrowing]
我们把有问题的这段代码摘出来,可以看到{}中以十六进制表示的数字,有的是超过127的,因为字面整数默认是int类型,所以这里会出现这个错误。
void CLASS vng_interpolate(){ static const signed char *cp, terms[] = { -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01, -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01, -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03, -2,+1,-1,+0,0,0x04, -2,+1,+0,-1,1,0x04, -2,+1,+0,+0,0,0x06, -2,+1,+0,+1,0,0x02, -2,+2,+0,+0,1,0x04, -2,+2,+0,+1,0,0x04, -1,-2,-1,+0,0,0x80, -1,-2,+0,-1,0,0x01, -1,-2,+1,-1,0,0x01, -1,-2,+1,+0,1,0x01, -1,-1,-1,+1,0,0x88, -1,-1,+1,-2,0,0x40, -1,-1,+1,-1,0,0x22, -1,-1,+1,+0,0,0x33, -1,-1,+1,+1,1,0x11, -1,+0,-1,+2,0,0x08, -1,+0,+0,-1,0,0x44, -1,+0,+0,+1,0,0x11, -1,+0,+1,-2,1,0x40, -1,+0,+1,-1,0,0x66, -1,+0,+1,+0,1,0x22, -1,+0,+1,+1,0,0x33, -1,+0,+1,+2,1,0x10, -1,+1,+1,-1,1,0x44, -1,+1,+1,+0,0,0x66, -1,+1,+1,+1,0,0x22, -1,+1,+1,+2,0,0x10, -1,+2,+0,+1,0,0x04, -1,+2,+1,+0,1,0x04, -1,+2,+1,+1,0,0x04, +0,-2,+0,+0,1,0x80, +0,-1,+0,+1,1,0x88, +0,-1,+1,-2,0,0x40, +0,-1,+1,+0,0,0x11, +0,-1,+2,-2,0,0x40, +0,-1,+2,-1,0,0x20, +0,-1,+2,+0,0,0x30, +0,-1,+2,+1,1,0x10, +0,+0,+0,+2,1,0x08, +0,+0,+2,-2,1,0x40, +0,+0,+2,-1,0,0x60, +0,+0,+2,+0,1,0x20, +0,+0,+2,+1,0,0x30, +0,+0,+2,+2,1,0x10, +0,+1,+1,+0,0,0x44, +0,+1,+1,+2,0,0x10, +0,+1,+2,-1,1,0x40, +0,+1,+2,+0,0,0x60, +0,+1,+2,+1,0,0x20, +0,+1,+2,+2,0,0x10, +1,-2,+1,+0,0,0x80, +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40, +1,+0,+2,+1,0,0x10 }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 };
将上面的代码改为下面的形式即可
void CLASS vng_interpolate(){ static const signed char *cp, terms[] = { -2,-2,+0,-1,0,(char)0x01, -2,-2,+0,+0,1,(char)0x01, -2,-1,-1,+0,0,(char)0x01, -2,-1,+0,-1,0,(char)0x02, -2,-1,+0,+0,0,(char)0x03, -2,-1,+0,+1,1,(char)0x01, -2,+0,+0,-1,0,(char)0x06, -2,+0,+0,+0,1,(char)0x02, -2,+0,+0,+1,0,(char)0x03, -2,+1,-1,+0,0,(char)0x04, -2,+1,+0,-1,1,(char)0x04, -2,+1,+0,+0,0,(char)0x06, -2,+1,+0,+1,0,(char)0x02, -2,+2,+0,+0,1,(char)0x04, -2,+2,+0,+1,0,(char)0x04, -1,-2,-1,+0,0,(char)0x80, -1,-2,+0,-1,0,(char)0x01, -1,-2,+1,-1,0,(char)0x01, -1,-2,+1,+0,1,(char)0x01, -1,-1,-1,+1,0,(char)0x88, -1,-1,+1,-2,0,(char)0x40, -1,-1,+1,-1,0,(char)0x22, -1,-1,+1,+0,0,(char)0x33, -1,-1,+1,+1,1,(char)0x11, -1,+0,-1,+2,0,(char)0x08, -1,+0,+0,-1,0,(char)0x44, -1,+0,+0,+1,0,(char)0x11, -1,+0,+1,-2,1,(char)0x40, -1,+0,+1,-1,0,(char)0x66, -1,+0,+1,+0,1,(char)0x22, -1,+0,+1,+1,0,(char)0x33, -1,+0,+1,+2,1,(char)0x10, -1,+1,+1,-1,1,(char)0x44, -1,+1,+1,+0,0,(char)0x66, -1,+1,+1,+1,0,(char)0x22, -1,+1,+1,+2,0,(char)0x10, -1,+2,+0,+1,0,(char)0x04, -1,+2,+1,+0,1,(char)0x04, -1,+2,+1,+1,0,(char)0x04, +0,-2,+0,+0,1,(char)0x80, +0,-1,+0,+1,1,(char)0x88, +0,-1,+1,-2,0,(char)0x40, +0,-1,+1,+0,0,(char)0x11, +0,-1,+2,-2,0,(char)0x40, +0,-1,+2,-1,0,(char)0x20, +0,-1,+2,+0,0,(char)0x30, +0,-1,+2,+1,1,(char)0x10, +0,+0,+0,+2,1,(char)0x08, +0,+0,+2,-2,1,(char)0x40, +0,+0,+2,-1,0,(char)0x60, +0,+0,+2,+0,1,(char)0x20, +0,+0,+2,+1,0,(char)0x30, +0,+0,+2,+2,1,(char)0x10, +0,+1,+1,+0,0,(char)0x44, +0,+1,+1,+2,0,(char)0x10, +0,+1,+2,-1,1,(char)0x40, +0,+1,+2,+0,0,(char)0x60, +0,+1,+2,+1,0,(char)0x20, +0,+1,+2,+2,0,(char)0x10, +1,-2,+1,+0,0,(char)0x80, +1,-1,+1,+1,0,(char)0x88, +1,+0,+1,+2,0,(char)0x08, +1,+0,+2,-1,0,(char)0x40, +1,+0,+2,+1,0,(char)0x10 }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 };
(2) C++11的原始字符串与宏定义R产生的错误
这个错误是因为你的编译器支持的是C++ 11的标准,C++11中引入了原始字符串的新特性,使用R”“等方式来定义一个不进行转义的字符串。而在FreeImage的一些代码中,使用了R作为一些宏函数的参数,导致一些场合会将其当做是一个原始字符串。
先来看一下报错信息
Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:34: 错误:原始字符串分隔符中有无效字符‘ ’ "shll_s.w %["#R"], %["#R"], 9 \n\t" \ ^ Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:48: 错误:原始字符串分隔符中有无效字符‘ ’ "shll_s.w %["#R"], %["#R"], 9 \n\t" \ ^ Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:40:34: 错误:原始字符串分隔符中有无效字符‘ ’ "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \ ^ Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:40:48: 错误:原始字符串分隔符中有无效字符‘ ’ "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \ ^ Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:43:34: 错误:原始字符串分隔符中有无效字符‘ ’ "srl %["#R"], %["#R"], 24 \n\t" \ ^ Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:43:48: 错误:原始字符串分隔符中有无效字符‘ ’ "srl %["#R"], %["#R"], 24 \n\t" \
报错的文件是dsp.upsampling_mips_dsp_r2.c。这是一个.c的文件,使用gcc编译也会出现这个错误。报错的代码如下(dsp.upsampling_mips_dsp_r2.c 22-49)
#if !defined(WEBP_YUV_USE_TABLE)#define YUV_TO_RGB(Y, U, V, R, G, B) do { \ const int t1 = kYScale * Y; \ const int t2 = kVToG * V; \ R = kVToR * V; \ G = kUToG * U; \ B = kUToB * U; \ R = t1 + R; \ G = t1 - G; \ B = t1 + B; \ R = R + kRCst; \ G = G - t2 + kGCst; \ B = B + kBCst; \ __asm__ volatile ( \ "shll_s.w %["#R"], %["#R"], 9 \n\t" \ "shll_s.w %["#G"], %["#G"], 9 \n\t" \ "shll_s.w %["#B"], %["#B"], 9 \n\t" \ "precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \ "precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \ "precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \ "srl %["#R"], %["#R"], 24 \n\t" \ "srl %["#G"], %["#G"], 24 \n\t" \ "srl %["#B"], %["#B"], 24 \n\t" \ : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \ : \ ); \ } while (0)
上面代码中的第16行起,有多处是R”],的形式。这里编译器会将其当做一个原始字符串,从而导致错误。做如下修改,将所有的R都使用Red替代。
#if !defined(WEBP_YUV_USE_TABLE)#define YUV_TO_RGB(Y, U, V, Red, G, B) do { \ const int t1 = kYScale * Y; \ const int t2 = kVToG * V; \ Red = kVToR * V; \ G = kUToG * U; \ B = kUToB * U; \ Red = t1 + Red; \ G = t1 - G; \ B = t1 + B; \ Red = Red + kRCst; \ G = G - t2 + kGCst; \ B = B + kBCst; \ __asm__ volatile ( \ "shll_s.w %["#Red"], %["#Red"], 9 \n\t" \ "shll_s.w %["#G"], %["#G"], 9 \n\t" \ "shll_s.w %["#B"], %["#B"], 9 \n\t" \ "precrqu_s.qb.ph %["#Red"], %["#Red"], $zero \n\t" \ "precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \ "precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \ "srl %["#Red"], %["#Red"], 24 \n\t" \ "srl %["#G"], %["#G"], 24 \n\t" \ "srl %["#B"], %["#B"], 24 \n\t" \ : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \ : \ ); \ } while (0)
这个错误还会出现在Source/LibWebP/./src/dsp/dsp.yuv_mips_dsp_r2.c文件中,修改的方式是一样的。
(3)tmpnam与mkstemp的选择
这并不是一个错误,只是一个警告。
Source/LibJXR/./image/encode/strenc.o:在函数‘StrIOEncInit’中:strenc.c:(.text+0x17cc): 警告: the use of `tmpnam' is dangerous, better use `mkstemp'
tmpnam函数是危险的,建议使用mkstemp。原因是mkstemp调用完成后,就已经生成并打开了一个临时文件,而tmpnam只是生成了一个临时文件的文件名,并没有创建文件,不能保证其一定不存在!!!
这里就不做修改了。
- 关于FreeImage的linux版本编译
- linux FreeImage安装编译
- 寻求关于FreeImage的使用帮助
- 关于编译版本的问题
- FreeImage图形库如何在Linux下的使用
- linux 下使用FreeImage制作图像的缩略图
- FreeImage图形库如何在Linux下的使用
- {Android-编译FreeImage For Android}
- FreeImage 编译错误 C1189 VS2015
- 使用Mingw-w64编译FreeImage
- 关于多语言版本编译的问题
- 关于android版本编译的问题
- 关于Linux的版本问题
- FreeImage的图像处理软件
- FreeImage
- 编译Linux版本飞鸽传书的不完全解决办法
- linux下编译debug版本的ace
- linux下编译dcmtk的Android版本
- 德国人造车留一手
- [Spring]配置简单Bean详解
- 用Mac打造自己的DNS服务器
- Maven学习笔记(四)-Eclipse创建Maven项目
- H5数据本地存储webStore
- 关于FreeImage的linux版本编译
- android 调用通讯录号码同时进入播号界面
- 拯救地球?错了!
- 处女作
- WebService
- Note 7陨落下的骨诺牌效应,三星从此走向衰亡将韩国经济拖下悬崖?
- service上toast
- Spring学习笔记一
- Git使用-1