为了需求给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 = 1, exit_status = 0; ImageInfo *imageInfo; ExceptionInfo exception; InitializeMagick(NULL); imageInfo=CloneImageInfo(0); GetExceptionInfo(&exception); if (argc != 3) { (void) fprintf ( stderr, "Usage: %s infile outfile ", argv[0] ); (void) fflush(stderr); exit_status = 1; goto program_exit; } (void) strncpy(infile, argv[arg], MaxTextExtent-1 ); arg++; (void) strncpy(outfile, argv[arg], MaxTextExtent-1 ); (void) strcpy(imageInfo->filename, infile); image = ReadImage(imageInfo, &exception); if (image == (Image *) NULL) { CatchException(&exception); exit_status = 1; goto program_exit; } (void) strcpy(image->filename, outfile); if (!WriteImage (imageInfo,image)) { CatchException(&image->exception); exit_status = 1; 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.21/lib /opt/wbq/third_partylib/bzip2-1.0.6/lib /opt/wbq/third_partylib/libpng-1.6.18/lib /opt/wbq/third_partylib/libwebp-0.4.3/lib /opt/wbq/third_partylib/libxml2-2.9.2/lib /opt/wbq/third_partylib/mozjpeg-2.1/lib /opt/wbq/third_partylib/tiff-4.0.4/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.21/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/'