【发布时间】:2011-05-27 06:31:32
【问题描述】:
假设我有一个 libmy.a 静态库,我想知道它动态链接了哪些库。实际上我需要以下内容:我将创建一个新的动态库,比如 libmy2.so,它将链接一个 .o 文件(目标文件)和 libmy.a。所以我想知道什么库最终会加载 libmy2.so。
【问题讨论】:
标签: c++ linker libraries loader
假设我有一个 libmy.a 静态库,我想知道它动态链接了哪些库。实际上我需要以下内容:我将创建一个新的动态库,比如 libmy2.so,它将链接一个 .o 文件(目标文件)和 libmy.a。所以我想知道什么库最终会加载 libmy2.so。
【问题讨论】:
标签: c++ linker libraries loader
静态库不链接其他库,无论是静态的还是动态的。
好的,假设有两个 C++ 文件,a.cpp 和 b.cpp。
g++ -c a.cpp -o a.o // compile a.cpp to a.o
rm -f lib1.a // no existing lib1.a (this is not essential)
ar rvs lib1.a a.o // create library lib1.a and add a.o to it
g++ -c b.cpp -o b.o // compile b.cpp to b.o
ar rvs lib1.a b.o // ad b.o to existing lib1.a
显然,您可以在各个阶段之间进行任意数量的复制,以生成具有您想要的名称的库。你也可以这样做
ar --help
获取 ar 选项,这可能会稍微简化流程。坦率地说,这是我几乎从不使用的命令,除了从对象列表构建静态库。
【讨论】:
在 Mac 上,它会是 nm -m C libname.a
【讨论】:
您可以使用以下命令检查静态库的内容:
nm -C libname.a | less
或
$ar -vt libname.a
【讨论】:
动态库将仅动态链接到您在构建时使用-l 指定的那些动态库。静态库主要是链接代表一组 *.o 文件的时间实体,它们必须由链接器处理以生成可执行代码,因此在构建静态库时不需要提供所有实现。一切都是在目标可执行文件的最终链接期间设置的。
【讨论】: