g++ 如何链接所需的库?

How g++ links in required libraries?

让我们考虑依赖于 libB.so、libC.so、libD.so:

的构建 libA.so 的常用命令
$g++ -shared -L/path/to/libB -L/path/to/libC -L/path/to/libD
-lB -lC -lD
-I/path/to/headers 
 libA.cpp -o libA.so

未定义的符号与需要的库名之间是否存在映射:

undefined_symbol_1 comes from libB.so
undefined_symbol_2 comes from libC.so
undefined_symbol_3 comes from libC.so
undefined_symbol_4 comes from libC.so
undefined_symbol_5 comes from libD.so

或者它们只是分开存放:

未定义符号:undefined_symbol_1、undefined_symbol_2、undefined_symbol_3、undefined_symbol_4、undefined_symbol_5; 所需的库:"libB.so"、"libC.so"、"libD.so";

库中包含未定义的符号及其来源的库信息。

您可以通过多种方式列出信息。一种方法是 objdump。

例如,查看 libcurl 动态符号:

> objdump -T /usr/lib/x86_64-linux-gnu/libcurl.so
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 pthread_detach
0000000000000000      DF *UND*  0000000000000000  NETTLE_6    nettle_md4_init
.
.

版本信息中定义了GLIBC_2.2.5等名称,可见运行

> objdump -x /usr/lib/x86_64-linux-gnu/libcurl.so
.
.
Version References:
.
required from libnettle.so.6:
  0x0a991006 0x00 06 NETTLE_6
required from libc.so.6:
  0x09691a75 0x00 05 GLIBC_2.2.5
.