linux下静态编译第三方库

linux下静态编译第三方库

作者: yym439 时间: 2020-04-02

1.ZLIB静态编译

官网

1.解压:
tar -xvf zlib-1.2.11.tar.gz

2.修改CMakeLists.txt文件,新增:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
注意:编译静态库需要添加-fPIC,否则动态库链接该静态库的时候会提示出错
(relocation R_X86_64_32 against)。

3. cmake .

4. make install

2. libusb静态编译

https://blog.csdn.net/gd6321374/article/details/79903132

注意:静态编译添加-fPIC,进入libusb源码目录修改Makefile中的CFLAGS(不是根目录的Makefile,别找错了)

3. mupdf静态编译

  • mupdf-1.3-source.tar.gz

  • 修改Makefile中的CFLAGS,添加-fPIC

  • 解压进入目录,执行sudo make generate

  • sudo make

  • 源码自带pdf转png例子路径(不同版本接口有差异):docs/example.c

3.1 mupdf-1.18版本,pdf转png:

// 拷贝源码:/source/tools/mudraw.c
//gcc -o example mudraw.c example.c libmupdf.a libmupdf-third.a -lm

#include "include/fitz.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//mudraw.c实现
int mudraw_main(int argc, char *argv[]);

int main(int argc, char **argv)
{
	char **c = (char**)malloc(5 * sizeof(char*));
	for (int i = 0; i < 5; ++i){
		c[i] = (char *)malloc(1024);
	}
	c[0] = "./exampl12";//随便填必须要有
	c[1] = "-o";//输出参数
	c[2] = "%d.png"; //输出图片
	c[3] = "t.pdf";//pdf文件
	//c[4] = "1-3";//要转换的页码,不填默认转换整个pdf文件(第一个参数填4)
	int ret = mudraw_main(4,c);
	printf("ret=%d\r\n",ret);
	return 0;
}

3.2 获取pdf文档页数:


#include "include/fitz.h"
#include "include/pdf.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static pdf_document *doc = NULL;
static fz_context *ctx = NULL;

int get_pdf_pages(char *filename)
{
	ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
	if (!ctx)
	{
		fprintf(stderr, "cannot initialise context\n");
		return -1;
	}
	
	fz_var(doc);
	fz_try(ctx)
	{
		doc = pdf_open_document(ctx, filename);
	}
	fz_catch(ctx)
	{
		fprintf(stderr, "cannot open document\n");
		return -2;
	}	
	
	//获取页数
	int pages = pdf_count_pages(ctx, doc);
	
	pdf_drop_document(ctx, doc);
	fz_drop_context(ctx);
	return pages;
}

int main(int argc, char **argv)
{

	int ret = get_pdf_pages("t.pdf");
	printf("total pages = %d\r\n",ret);
	return 0;
}

注意: mupdf和opencv都存在jpeg库函数重复定义,解决方法(删除静态库重复定义的执行文件):ar d libmupdf-third.a jutils.o
linux下查看修改静态库