Makefile 链接静态库

Makefile 链接静态库,第1张

Linux的静态库是以.a结尾的,要连接静态库有两种方法,一种是在编译命令最后直接加上库路径/库名称。

例如你的库在绝对目录/lib/libtest.a下面

你就可以这样来编译

你可以用-L制定库的目录,用-l指定库的名称。(是一起用的-L -l)

例如库的名称为libtest.a 那么就用-ltest

注:-ltest要放在-o的后面,不然不会起作用。

详细可参考: https://blog.csdn.net/u011964923/article/details/73297443

在Ubutu上编译出来的.so文件,怎么添加到Android项目中去使用呢?目前:可以通过

Makefile方式和CMake方式引入预编译静动态库(静态库.a 动态库.so)到项目中去使用。就目前而言CMake是Goole推荐使用方式,但是加入接手一个老的NDK项目是MakeFile方式,看不懂就GePi了,所以这里我们还是介绍一下MakeFile方式将静动态库加入到AS中,完成NDK项目的开发。废话不多说,直接撸步骤了:

1、在src/main目录下创建一个ndkBuild文件夹

2、在此文件中创建一个Android.mk文件

3、在此文件中创建一个test.c的源文件

4、将编译好的的.so库复制到src/main目录下

如图所示目录结构:

1、编辑Android.mk文件

2、编辑grade(app)文件

3、编辑test.c文件

4、使用编译好的.so库里面的函数

本结果运行在Android 5.1 系统上

再次运行在Android8.0系统上

看以清楚知道,其实我们的APK包里面就没有libMainTest.so库,所以APP在8.0上会出现奔溃的现象。so...

1、在src/main目录下创建一个cmake文件夹

include:里面包含需要一些头文件

cmakeTest.c:需要编译的源文件

2、在app目录下创建一个文件:CmakeLists.txt

3、编辑grade(app)

4、编辑cmakeTest.c文件

4、引用编译好的libcmakeTest.so

Android 8.0.0系统:

Android 5.1.1系统:

编写Makefile生成静态库的方法:

方法一

//////////////////////////////////////////////////////////////////

divFIX=/usr

LIBDIR=$(divFIX)/lib

INCLUDEDIR=$(divFIX)/include

#$(DESTDIR) is usally empty. rpmbuild needs it.

DESTDIR=

CC=gcc

CFLAGS=

LIBS=

INCLUDES=

AR=ar

all: hello.a

hello.a: file1.o file2.o

$(AR) -r $@ $^

file1.o: file1.c

$(CC) $(CFLAGS) -c $^ -o $@ $(LIBS) $(INCLUDES)

file2.o: file2.c

$(CC) $(CFLAGS) -c $^ -o $@ $(LIBS) $(INCLUDES)

install:

@echo Copying library files to $(DESTDIR)/$(LIBDIR):

@cp -rp libthreadpool.a $(DESTDIR)/$(LIBDIR)/

@echo Copying head files to $(DESTDIR)/$(DATADIR):

@cp -rp src/thread-pool.h $(DESTDIR)/$(INCLUDEDIR)/

clean:

rm -rf *.o \

*.a

uninstall:

rm -rf $(LIBDIR)/hello.a\

$(INCLUDEDIR)/hello.h

//////////////////////////////////////////////////////////////////////////

方法二

gcc -o hellofile.a file1.o file2.o -lc -lm -shared

动态库

gcc -o hellofile.so file1.o file2.o -lc -lm -shared

# -lpthread 线程

# -shared共享库

# -lm 表示连接名为“libm.a”的数学函数库

# -lc 代表链接器将连接GCC的标准C库

# -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

# -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

# .a为后缀的文件,是由目标文件构成的档案库文件;

# .so 为动态库。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11572272.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存