我想知道当我使用命令 "g++ -o main main.o -L<directory> -l<lib_name>" 时发生了什么

I want to know what happened when I use the command "g++ -o main main.o -L<directory> -l<lib_name>"

假设我在当前目录中有 main.c main.o libheymath.so。我想link把它们一起生成一个可执行文件。我使用命令 "g++ -o main main.o -L./ -lheymath" 来实现这一点。但是不知道为什么要注明库目录和名称。据我所知,当我 运行 "./main" 时,系统会将共享库加载到特定目录中的内存中,例如 /lib/use/lib 以及在 LD_LIBRARY_PATH 等中指定的目录,但不是我所指出的。那么 "-L./ -lheymath" 的目的是什么?

working directory files:

main.c, main.o, libheymath.so

命令:

g++ -o main main.o -L./ -lheymath

./main

-L 允许指示在 link 时间寻找 lib(s) 的路径(它不是 'saved' 在生成的可执行文件中,当您启动可执行文件时要重用)

-l 表示您想要 link 的库,这允许检查是否缺少某些符号,并知道在启动可执行文件时要加载的库列表。

当你 link 这些库的路径不会保存到可执行文件中,因为可执行文件和库都可以在 link 之后移动(并且可能安装在其他主机上)

注意 LD_LIBRARY_PATH 在启动可执行文件以查找动态库时使用,在 link objects/libs 生成可执行文件时不使用