我正在尝试学习如何制作静态和动态库,但我对老师关于库的讲解有点不理解。我创建动态库的想法是这样的:
gcc -c main.c -o main.o
gcc -c -fPIC func.c -o func.o
gcc -shared -Wl,-soname,-libfunc.so.1 -o libfunc.so.1.0.1 func.o
ldconfig -n .
ln -sf libfunc.so.1.0.1 libfunc.so
gcc main.o libfunc.so.1.0.1 -o prog1
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
现在我的老师说倒数第二行必须是这样的:
gcc main.o -o prog1 -L. -lfunc
有人能解释一下这两者之间的确切区别吗?谢谢!
答案1
-l<name>
只是一个快捷方式,说“在配置的库路径中查找lib<name>.so
或”,并将当前目录添加到该路径。lib<name>.a
-L.
当然,-l
在使用真实库时是首选,因为这样不需要知道库的完整路径和各种操作系统详细信息(例如.so
vs .dylib
vs .a
vs .dll
),但是在输出可执行文件时应该没有区别。
$ gcc -o out1 main.c libtest.so
$ gcc -o out2 main.c -L. -ltest
$ md5sum out*
b1b8f46bf6091377b202df90d6bd32cc out1
b1b8f46bf6091377b202df90d6bd32cc out2
有关和ld
的详细描述,请参阅手册页。-l
-L