Linux 中 C 编程中的 .a 文件是什么?
是库文件吗?
To merge with the math library libm.a you would type
cc -o program_name prog.c -lm
when you compile the program. The -lm means: add in libm. If we wanted to add in the socket library libsocket.a to do some network programming as well, we would type
cc -o program_name prog.c -lm -lsocket
and so on.
这里编译器如何发现 -lm 指向文件 libm.a ,而 -lsocket 指向 libsocket.a ?
如果我们将头文件添加到程序中,我们是否必须在编译时提及库?
正如 Ignacio 所说,.a 文件是静态库。 “a”代表“archive”,.a 文件是由名为“ar”的程序构建的。
每个 .a 文件包含一个或多个 .o 文件和一个名称索引。在链接过程中,只有包含已用名称的 .o 文件才会包含在最终程序中。这样一来,就不会复制整个 C 库,而只会复制“printf”等使用过的函数。
编译器如何找到库?它有一个内置的搜索库路径集合。例如,如果询问,GCC 会告诉您其搜索路径:
# gcc -print-search-dirs
install: /usr/lib/gcc/i686-redhat-linux/4.4.4/
programs: =/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/:/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/bin/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/bin/
libraries: =/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/lib/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/lib/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../:/lib/i686-redhat-linux/4.4.4/:/lib/:/usr/lib/i686-redhat-linux/4.4.4/:/usr/lib/
您可以使用“-L /path”选项添加更多库搜索路径。
在这些路径中,它首先搜索以“.so”扩展名命名的“动态库”。然后它搜索具有“.a”扩展名的静态库。它总是在名称前面添加“lib”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)