Graphicmagick编译
为了需求给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编译的更多相关文章
- TODO:macOS编译PHP7.1
TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...
- Centos6.5下编译安装mysql 5.6
一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...
- CENTOS 6.5 平台离线编译安装 PHP5.6.6
一.下载php源码包 http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror 二.编译 编译之前可能会缺少一些必要的依赖包,加载一个本地yum ...
- CENTOS 6.5 平台离线编译安装 Mysql5.6.22
一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...
- Android注解使用之注解编译android-apt如何切换到annotationProcessor
前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ...
- Hawk 6. 编译和扩展开发
Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 在Windows上编译和调试CoreCLR
生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装 ...
- 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~
这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...
随机推荐
- CSU-2221 假装是区间众数(ST表模版题)
题目链接 题目 Description 给定一个非递减数列Ai,你只需要支持一个操作:求一段区间内出现最多的数字的出现次数. Input 第一行两个整数N,Q 接下来一行有N个整数,表示这个序列. 接 ...
- 从输入url开始,完善前端体系架构
原文链接: https://segmentfault.com/a/1190000013662126 从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系! javascript 前端 23 ...
- DNS 劫持、HTTP 劫持与 DNS 污染
本文为本人的学习笔记,不保证正确. DNS 劫持 指DNS服务器被控制,查询DNS时,服务器直接返回给你它想让你看的信息.这种问题常为 ISP 所为. 由于一般的的电脑的 DNS 服务器 的配置都为自 ...
- 节点流——FileInputStream&FileOutputStream
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- BZOJ 3509 [CodeChef] COUNTARI ——分块 FFT
分块大法好. 块内暴力,块外FFT. 弃疗了,抄SX队长$silvernebula$的代码 #include <map> #include <cmath> #include & ...
- JavaScript (JS) 函数补充 (含arguments、eval()、四种调用模式)
1. 程序异常 ① try-catch语法 测试异常 try-catch语法代码如下: try { 异常代码; try中可以承重异常代码, console.log(“try”) 出现异 ...
- onbeforeunload 的使用
原文发布时间为:2008-10-20 -- 来源于本人的百度文章 [由搬家工具导入] onbeforeunload 可以在页面关闭,刷新,跳转时弹出提示信息,防止意外的跳转使得当前页的表单内容被清空。 ...
- MongoDB如何使用“”用户名和密码“”
在去年的 DB 勒索事件之后, 不少的同学开始加强 Mongodb 的安全性, 其中一种办法就是设置复杂的密码. 那么问题来了, 如果设置的密码里包含一些如 “@”, “:” 一样的特殊字符怎么办? ...
- paramiko模块及ssh远程登陆
ssh实现远程登陆一般有两种方式,一种就是用户密码登陆,另一种是密钥登陆(当然默认是要服务端打开ssh服务). 我这里使用这两种方法操作一下远程登陆,测试客户端是本机的root与jeff用户,远程连接 ...
- 354. Russian Doll Envelopes
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...