标签:去哪里 同名 linux 编译链接 指定 选项 file SM pre
文件的目录结构是:
$ tree . |-- main.c `-- stack |-- is_empty.c |-- pop.c |-- push.c |-- stack.c `-- stack.h 1 directory, 6 files
我们把stack.c
、push.c
、pop.c
、is_empty.c
编译成目标文件:
$ gcc -c stack/stack.c stack/push.c stack/pop.c stack/is_empty.c
然后打包成一个静态库libstack.a
:
$ ar rs libstack.a stack.o push.o pop.o is_empty.o ar: creating libstack.a
库文件名都是以lib
开头的,静态库以.a
作为后缀,表示Archive。ar
命令类似于tar
命令,起一个打包的作用,但是把目标文件打包成静态库只能用ar
命令而不能用tar
命令。选项r
表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包中已有同名文件就替换成新的。s
是专用于生成静态库的,表示为静态库创建索引,这个索引被链接器使用。ranlib
命令也可以为静态库创建索引,以上命令等价于:
$ ar r libstack.a stack.o push.o pop.o is_empty.o $ ranlib libstack.a
然后我们把libstack.a
和main.c
编译链接在一起:
$ gcc main.c -L. -lstack -Istack -o main
-L选项告诉编译器去哪里找需要的库文件,-L.
表示在当前目录找。-lstack
告诉编译器要链接libstack
库,-I
选项告诉编译器去哪里找头文件。注意,即使库文件就在当前目录,编译器默认也不会去找的,所以-L.
选项不能少。编译器默认会找的目录可以用-print-search-dirs
选项查看:
$ gcc -print-search-dirs install: /usr/lib/gcc/i486-linux-gnu/4.3.2/ programs: =/usr/lib/gcc/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/:/usr/libexec/gcc/i486-linux-gnu/4.3.2/:/usr/libexec/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../i486-linux-gnu/bin/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../i486-linux-gnu/bin/ libraries: =/usr/lib/gcc/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../i486-linux-gnu/lib/i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../i486-linux-gnu/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../i486-linux-gnu/4.3.2/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/:/lib/i486-linux-gnu/4.3.2/:/lib/../lib/:/usr/lib/i486-linux-gnu/4.3.2/:/usr/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../i486-linux-gnu/lib/:/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../:/lib/:/usr/lib/
其中的libraries
就是库文件的搜索路径列表,各路径之间用:
号隔开。编译器会在这些搜索路径以及-L
选项指定的路径中查找用-l
选项指定的库,比如-lstack
,编译器会首先找有没有共享库libstack.so
,如果有就链接它,如果没有就找有没有静态库libstack.a
,如果有就链接它。所以编译器是优先考虑共享库的,如果希望编译器只链接静态库,可以指定-static
选项。
标签:去哪里 同名 linux 编译链接 指定 选项 file SM pre
原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9057861.html