为了需求给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. Redis的 SORT命令

      SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [S ...

  2. POJ 2723 Get Luffy Out(2-SAT+二分答案)

    Get Luffy Out Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8851   Accepted: 3441 Des ...

  3. BZOJ2141&洛谷1975 排队 【线段树套treap】

    题目 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别,排 ...

  4. linux系统初始化——busybox的inittab文件格式说明

    busybox的inittab文件格式说明 要写自己的inittab,需要理解busybox的inittab文件格式. busybox的inittab文件与通常的inittab不同,它没有runlev ...

  5. app自动测试-微信(iOS)-web-1

    appium 是一个用于app自动测试的工具.目前支持测试iOS, Android, Windows上的app.(github: https://github.com/appium/appium) 其 ...

  6. 微信小程序统一服务消息下发接口 公众号和小程序消息都可以在一个接口推送了

    昨天晚上,2018年9月11日,微信官方又更新了一大波的小程序功能.重点我们来谈谈这个功能,微信叫做统一服务消息下发接口. 这个是官方的文档  统一服务消息 · 小程序https://develope ...

  7. shell script 的简单介绍

    一 什么叫shell script (程序化脚本)? shell script 是利用 shell 的功能所写的一个 “程序”(program),这个程序是使用纯文本文件,将一些 shell 的语法与 ...

  8. 第一个nodejs爬虫:爬取豆瓣电影图片

    第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require( ...

  9. 在razor中使用递归,巧用递归

    原文发布时间为:2011-04-20 -- 来源于本人的百度文章 [由搬家工具导入] Learning Razor–Writing an Inline Recursive HTML Helper Wr ...

  10. 十步完全理解 SQL(转载)

    1 SQL是一种声明式语言 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果.学好SQL要改变传统函数式编程思想,例如用变量传参.使用循环语 ...