为了需求给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. [luogu_P2045]方格取数加强版

    [luogu_P2045]方格取数加强版 试题描述 给出一个 \(n \times n\) 的矩阵,每一格有一个非负整数 \(A_{i,j},(A_{i,j} \le 1000)\) 现在从 \((1 ...

  2. Java EE 学习(5):IDEA + maven + spring 搭建 web(1)

    参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...

  3. react当中子组件改变父组件的状态

    子组件直接改变父组件传入的props值是不被允许的, 当需要在子组件当中改变父组件的某一个状态, 父组件传入一个改变状态的函数,然后在子组件当中调用函数即可

  4. 洛谷 [P3377] 左偏树(可并堆)

    可并堆,就是可以合并的堆 注意并查集不能路径压缩,不然删除根节点时会出错 #include <iostream> #include <cstring> #include < ...

  5. 网页制作教程:td也可以溢出隐藏显示【转】

    原文发布时间为:2010-02-05 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Stri ...

  6. dedeCMS php标签使用说明和数据库查询说明

    1.{dede:php}标签想要输出信息 可以直接使用printf , echo,var_dump 之类的打印出来   赋值给@me 无效 2.结合sql语句使用方法 例:{dede:php} $ro ...

  7. [LeetCode] Merge Intervals 排序sort

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  8. Struts2的使用注解配置Action(零配置)

    1.首先引入struts2注解的jar包:struts2-convention-plugin.jar ------------------------------第一种方式-------------- ...

  9. MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法

    项目在开发的时候在Mac平台下开发的,开发完了之后在LINUX环境上部署好之后,运行时MySQL数据库报错,提示为某个表不存在之类的错误信息,后来修改了MySQL的配置文件将大小写敏感去掉,问题解决. ...

  10. linux内核情景分析之信号实现

    信号在进程间通信是异步的,每个进程的task_struct结构有一个sig指针,指向一个signal_struct结构 定义如下 struct signal_struct { atomic_t cou ...