https://blog.csdn.net/soaringlee_fighting/article/details/65448010
GCC选项_-Wl,-soname
https://blog.csdn.net/gohome520/article/details/7259450
gcc指定程序运行时,额外包括库搜索路径
gcc main.c -g -o main -lget -L./ -Wl,-rpath=/home/Panodic/zengzhihao/work_place/get
"-L./"保证编译链接的正确,但是不保证运行时可以找到库路径
"-Wl,-rpath"指定程序运行时,搜索的库路径包括此位置
Makefile例子
all:
#gcc -g -fPIC -shared -o libget.so.1.2 get.c -Wl,-soname,libget.so.1
#gcc -g -fPIC -shared -o libget.so get.c
#gcc main.c -g -o main -lget -L./
#aarch64-linux-gnu-gcc -g -fPIC -shared -o libget.so.1.2 get.c -Wl,-soname,libget.so.1
aarch64-linux-gnu-gcc -g -fPIC -shared -o libget.so.1.2 get.c -Wl,-soname,libget.so.1,-rpath=/mnt/tmp
#create libget.so.1->libget.so.1.2
ldconfig -n ./
-ln -s ./libget.so.1.2 ./libget.so
aarch64-linux-gnu-gcc main.c -g -o main -lget -L./ -Wl,-rpath=/mnt/tmp/get
aarch64-linux-gnu-readelf -d libget.so.1.2
Dynamic section at offset 0x870 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: [libget.so.1]
0x000000000000000f (RPATH) Library rpath: [/mnt/tmp]
两个版本同时存在的Makefile
all:
aarch64-linux-gnu-gcc -g -fPIC -shared -o libget.so.1.0 get1.c -Wl,-soname,libget.so.1,-rpath=/mnt/tmp/get
aarch64-linux-gnu-gcc -g -fPIC -shared -o libget.so.2.0 get2.c -Wl,-soname,libget.so.2,-rpath=/mnt/tmp/get
#create libget.so.1->libget.so.1.0
#create libget.so.2->libget.so.2.0
ldconfig -n ./
#version 1
-ln -s ./libget.so.1.0 ./libget.so
aarch64-linux-gnu-gcc main.c -g -o main1 -lget -L./ -Wl,-rpath=/mnt/tmp/get
rm ./libget.so
-ln -s ./libget.so.2.0 ./libget.so
aarch64-linux-gnu-gcc main.c -g -o main2 -lget -L./ -Wl,-rpath=/mnt/tmp/get
aarch64-linux-gnu-readelf -d main1
0x0000000000000001 (NEEDED) Shared library: [libget.so.1]
aarch64-linux-gnu-readelf -d main2
0x0000000000000001 (NEEDED) Shared library: [libget.so.2]
第三方库交叉移植时,一般需要设置的参数
编译器
CC=
编译后的文件路径
--prefix=
链接的库路径
LDFLAGS=-L
链接的库的头文件路径
CPPFLAGS=-I
(头文件路径-I,库路径-L,链接库名-l)
CFLAGS 用于C编译器的选项,指定头文件路径,如CFLAGS+=-I/usr/include -I/path/include
LDFLAGS gcc等编译器使用的一些优化参数,也包括指定链接的库路径,如LDFLAGS+=-L/usr/lib -L./
LIBS 编译器需要链接哪些库,如LIBS+=-lpthread -lglib2
CXXFLAGS 用于C++编译器的选项
gcc main.c -g -o main -lget -L./ -Wl,-rpath=/home/Panodic/zengzhihao/work_place/get
"-L./"保证编译链接的正确,但是不保证运行时可以找到库路径
"-Wl,-rpath"指定程序运行时,搜索的库路径包括此位置
--enable-shared
--disable-shared
--enable-static
--disable-static