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

时间:2018-12-14 14:45:05

标签: c++ g++ ld

让我们考虑构建libA.so的常用命令,该命令取决于libB.so,libC.so,libD.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”;

1 个答案:

答案 0 :(得分:0)

该库包含未定义的符号和它们来自的库信息。

您可以通过多种方式列出信息。一种方法是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
.