为了需求给Graphicmagick加了几个支持,版本分别为mozjpeg2.1,bzip2-1.0.6,libpng-1.6.18,libwebp-0.4.3,mozjpeg-2.1,tiff-4.0.4,libxml2-2.9.2。

gcc使用4.8.2。

参考gm官网安装说明:http://www.graphicsmagick.org/README.html

首先需要从各个官网上下载这些源代码。百度云盘下载也可以:http://pan.baidu.com/s/1pJqXgNL

新建了/opt/wbq/third_partylib/文件夹来编译安装各个库。对于每个库新建一个同名文件夹

比如对于mozjpeg:

./configure --prefix=/opt/wbq/third_partylib/mozjpeg2.1

make

make install

安装完成后/opt/wbq/third_partylib/mozjpeg2.1内包含lib和include文件。其他几个库同理安装。

各个库装好以后可以参照各个库网站上的开发者说明写个小程序测试是不是都能使用。

其中tiff的测试需要自己搞个tif文件出来,windows下面工具链接:http://pan.baidu.com/s/1G0mJW

-------------------------------------------------------------------------------------------------------------------

有三个坑需要注意:

1,bzip2的安装中不需要configure和make,直接make install PREFIX=/opt/wbq/third_partylib/bzip2-1.0.6

2,libxml2的安装后在include文件下的目录结构是/libxml2/libxml/*.h这里如果直接使用include文件夹将会链接不到头文件,通过看libxml2的实例发现,需要使用下层目录include/libxml2,因为他的头文件编写都是#include <libxml/*.h>,解决xml支持failed tests问题。

3,由于bzip2生成的是.a 静态库,所以在Graphicmagick编译时候想调用libbzip2.a的话需要把bzip2用-fPIC的形式重新编译一下。

4,gcc4.8.2的编译时间很长很长……

-fPIC    Generates position-independent code for use in shared libraries (large model). 
-fpic    Generates position-independent code for use in shared libraries (small model).

创建共享库和链接可执行文件类似:首先把源代码编译成目标文件, 然后把目标文件链接起来。目标文件需要创建成位置无关码(position-independent code) (PIC),概念上就是在可执行程序装载它们的时候, 它们可以放在可执行程序的内存里的任何地方, (用于可执行文件的目标文件通常不是用这个方式编译的。) 链接动态库的命令包含特殊标志,与链接可执行文件的命令是有区别的。
gcc中的-fpic选项,使用于在目标机支持时,编译共享库时使用。编译出的代码将通过全局偏移表(Global Offset Table)中的常数地址访存,动态装载器将在程序开始执行时解析GOT表项(注意,动态装载器操作系统的一部分,连接器是GCC的一部分).
gcc中的-fPIC选项则是针对某些特殊机型做了特殊处理,比如适合动态链接并能避免超出GOT大小限制之类的错误。而Open64仅仅支持不会导致GOT表溢出的PIC编译。
GOT 大小8k ----SPARC 
32k---- m68k and RS/6000.
386 无限制.

-fPIC总是能够工作,但可能产生的代码较大。-fpic通常能产生更快更小的代码,但有平台限制。

Graphicmagick的configure:

./configure --prefix=/opt/wbq/third_partylib/GraphicsMagick-1.3.21  -enable-openmp -enable-shared CFLAGS='-fopenmp -O3 -msse3 -mssse3' CXXFLAGS='-fPIC -fopenmp -O3 -msse3 -mssse3' CPPFLAGS='-I/opt/local/include  -I/opt/wbq/third_partylib/bzip2-1.0.6/include  -I/opt/wbq/third_partylib/libpng-1.6.18/include  -I/opt/wbq/third_partylib/libwebp-0.4.3/include   -I/opt/wbq/third_partylib/libxml2-2.9.2/include/libxml2 -I/opt/wbq/third_partylib/mozjpeg-2.1/include  -I/opt/wbq/third_partylib/tiff-4.0.4/include' LDFLAGS='-L/opt/local/lib   -L/opt/wbq/third_partylib/bzip2-1.0.6/lib -L/opt/wbq/third_partylib/libpng-1.6.18/lib  -L/opt/wbq/third_partylib/libwebp-0.4.3/lib   -L/opt/wbq/third_partylib/libxml2-2.9.2/lib -L/opt/wbq/third_partylib/mozjpeg-2.1/lib  -L/opt/wbq/third_partylib/tiff-4.0.4/lib'  CXX=/opt/wbq/third_partylib/gcc-4.8.2/bin/g++ CC=/opt/wbq/third_partylib/gcc-4.8.2/bin/gcc

./configure --prefix=/opt/wbq/third_partylib/GraphicsMagick-1.3.21  -enable-openmp -enable-shared CFLAGS='-fopenmp -O3 -msse3 -mssse3' CXXFLAGS='-fPIC -fopenmp -O3 -msse3 -mssse3' CPPFLAGS='-I/opt/local/include  -I/opt/wbq/third_partylib/bzip2-1.0.6/include  -I/opt/wbq/third_partylib/libpng-1.6.18/include  -I/opt/wbq/third_partylib/libwebp-0.4.3/include   -I/opt/wbq/third_partylib/libxml2-2.9.2/include/libxml2 -I/opt/wbq/third_partylib/mozjpeg-2.1/include  -I/opt/wbq/third_partylib/tiff-4.0.4/include' LDFLAGS='-L/opt/local/lib   -L/opt/wbq/third_partylib/bzip2-1.0.6/lib -L/opt/wbq/third_partylib/libpng-1.6.18/lib  -L/opt/wbq/third_partylib/libwebp-0.4.3/lib   -L/opt/wbq/third_partylib/libxml2-2.9.2/lib -L/opt/wbq/third_partylib/mozjpeg-2.1/lib  -L/opt/wbq/third_partylib/tiff-4.0.4/lib'  CXX=/opt/wbq/third_partylib/gcc-4.8.2/bin/g++ CC=/opt/wbq/third_partylib/gcc-4.8.2/bin/gcc

得到支持列表:

后面make 然后make install一路通过,有两三个warning,查看发现时webp.la be moved的问题,google一下结论是不用管。

make install成功后在/opt/wbq/third_partylib/GraphicsMagick-1.3.21中生成gm的lib和include文件。

编写convert.c代码测试,这个代码主要是完成格式转换功能:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <magick/api.h> int main ( int argc, char **argv )
{
Image
*image = (Image *) NULL; char
infile[MaxTextExtent],
outfile[MaxTextExtent]; int
arg = ,
exit_status = ; ImageInfo
*imageInfo; ExceptionInfo
exception; InitializeMagick(NULL);
imageInfo=CloneImageInfo();
GetExceptionInfo(&exception); if (argc != )
{
(void) fprintf ( stderr, "Usage: %s infile outfile\n", argv[] );
(void) fflush(stderr);
exit_status = ;
goto program_exit;
} (void) strncpy(infile, argv[arg], MaxTextExtent- );
arg++;
(void) strncpy(outfile, argv[arg], MaxTextExtent- ); (void) strcpy(imageInfo->filename, infile);
image = ReadImage(imageInfo, &exception);
if (image == (Image *) NULL)
{
CatchException(&exception);
exit_status = ;
goto program_exit;
} (void) strcpy(image->filename, outfile);
if (!WriteImage (imageInfo,image))
{
CatchException(&image->exception);
exit_status = ;
goto program_exit;
} program_exit: if (image != (Image *) NULL)
DestroyImage(image); if (imageInfo != (ImageInfo *) NULL)
DestroyImageInfo(imageInfo);
DestroyMagick(); return exit_status;
}

然后编译:

gcc -o convert convert.c -O `/opt/wbq/third_partylib/GraphicsMagick-1.3.21/bin/GraphicsMagick-config --cppflags --ldflags --libs`

其中GraphicsMagick-config这个文件位于gm目录的bin中,记录了c编译的需要库和include信息。

这里有个坑:代码虽然编译通过了,但是运行:

./convert input.jpg output.bmp

不通过!提示:

“error while loading shared libraries: libGraphicsMagick.so.3: cannot open shared object file: No such file or directory”

没有找到libGraphicsMagick.so.3动态库?但是后面的链接中有gm lib。

原因应该是“原因可以归结为一句话:程序没有找到动态链接库,虽然这个动态链接库存在,但是默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件。”编辑/etc/ld.so.conf,在其中添加各个库的目录:

/opt/wbq/third_partylib/GraphicsMagick-1.3./lib
/opt/wbq/third_partylib/bzip2-1.0./lib
/opt/wbq/third_partylib/libpng-1.6./lib
/opt/wbq/third_partylib/libwebp-0.4./lib
/opt/wbq/third_partylib/libxml2-2.9./lib
/opt/wbq/third_partylib/mozjpeg-2.1/lib
/opt/wbq/third_partylib/tiff-4.0./lib
/usr/lib
/usr/local/lib

然后

ldconfig

到这里convert已经能运行了。

注:ldconfig是一个动态链接库管理命令,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.

最后搞完了,是在docker中编译的,用docker cp container_id:path/file host/path/file 把东西拷贝出来,即可。

如果是c++代码:

c++ -o demo demo.cpp -O `/opt/baoquanwang/third_partylib/GraphicsMagick-1.3./bin/GraphicsMagick++-config --cppflags --cxxflags --ldflags --libs`

备注:

实际编译路径:

./configure --prefix=/opt/baoquanwang/third_partylib/GraphicsMagick-1.3.21  -enable-openmp -without-x -enable-shared CFLAGS='-fopenmp -O3 -msse3 -mssse3' CXXFLAGS='-fPIC -fopenmp -O3 -msse3 -mssse3' CPPFLAGS='-I/opt/local/include  -I/opt/baoquanwang/third_partylib/bzip2-1.0.6/include  -I/opt/baoquanwang/third_partylib/libpng-1.6.18/include  -I/opt/baoquanwang/third_partylib/libwebp-0.4.3/include   -I/opt/baoquanwang/third_partylib/libxml2-2.9.2/include/libxml2 -I/opt/baoquanwang/third_partylib/mozjpeg-2.1/include  -I/opt/baoquanwang/third_partylib/tiff-4.0.4/include' LDFLAGS='-L/opt/local/lib   -L/opt/baoquanwang/wbqlibs/lib/ -Wl,-R/opt/baoquanwang/wbqlibs/lib/'

Graphicmagick编译的更多相关文章

  1. TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  2. Centos6.5下编译安装mysql 5.6

    一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...

  3. CENTOS 6.5 平台离线编译安装 PHP5.6.6

    一.下载php源码包 http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror 二.编译 编译之前可能会缺少一些必要的依赖包,加载一个本地yum ...

  4. CENTOS 6.5 平台离线编译安装 Mysql5.6.22

    一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...

  5. Android注解使用之注解编译android-apt如何切换到annotationProcessor

    前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ...

  6. Hawk 6. 编译和扩展开发

    Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...

  7. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  8. 在Windows上编译和调试CoreCLR

    生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装 ...

  9. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~

    这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...

随机推荐

  1. 07 JVM 是如何实现反射的

    Java 中的反射 反射是 Java 语言的一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为. 我们可以通过 Class 对象枚举该类中的所有方法,还可以通过 Met ...

  2. python 冒泡排序,快排

    一.冒泡排序 1.1.冒泡的原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的 ...

  3. 双网卡只有一个能ping通的解决办法

    来源:http://blog.csdn.net/centerpoint/article/details/38542719 Linux默认启用了反向路由检查 如果2个网卡在一个Lan里面,那么服务器可能 ...

  4. tomcat源码分析一

    废话少说,拉代码,导入eclipse开干,具体步骤可以参考http://hi.baidu.com/hateeyes/blog/item/7f44942a20ad8f9d023bf66d.html 下面 ...

  5. 只显示前几条数据的sql语句写法 七种数据库中Select Top的使用方法

    七种数据库中Select Top的使用方法 1. Oracle数据库 SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库 SELECT ...

  6. no for & 100 Array & Uint8Array & Typed Arrays

    no for & 100 Array http://hiluluke.cn/ bad function generate100Array() { var arr = new Array(100 ...

  7. P4302 [SCOI2003]字符串折叠

    题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如果A = A’, B = ...

  8. IX Samara Regional Intercollegiate Programming Contest F 三分

    F. Two Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  9. JavaScript 笔记(2) -- 类型转换 & 正则表达 & 变量提升 & 表单验证

    目录:  typeof, null, undefined, valueOf() 类型转换 正则表达式 错误: try, catch, throw 调试工具 变量提升 strict 严格模式 使用误区 ...

  10. python(3)-- 语句:条件、循环、break、continue...

    1. 条件语句 执行条件:判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围. [Python程序语言指定任何非0和非空(null)值为true,0 或 ...