【问题标题】:Creating a Minimal Shared Library创建最小的共享库
【发布时间】:2015-08-16 06:13:14
【问题描述】:

作为背景,我正在创建一些 C++ 软件,它使用动态加载的共享库插件来进行硬件输出(这里不涉及它的细节)。

我通过将所有内容编译成目标文件然后链接所需的文件来构建可执行文件,这很简单,使用排除列表。然后,我可以通过指定其主要目标文件(在运行时动态加载和访问的目标文件)以及主要目标文件引用的所有其他目标文件来构建共享库。

我的问题是:有没有办法为链接器提供主对象文件,并创建一个只包含它所依赖的对象的共享库?所有的目标文件都在同一个目录中,我没有使用 Makefile(还没有;如果可以解决问题,这是一个有效的答案),编译速度不是问题。

我查看了链接器选项 --as-needed--gc-sections--no-undefined,但我无法拼凑出一个有效的构建过程。

例如:对于源文件main.cppa.cppb.cppa.hb.h,其中main.cppa.cpp都包含b.h

gcc -fPIC -c *.cpp -I. 构建目标文件main.oa.ob.o

gcc -o main.out *.o 从目标文件构建最终的可执行文件main.out...包括未使用的 a.o。--gc-sections 应该解决此问题。)

gcc -fPIC -shared -o a.so a.o -Wl,--as-needed !(a).o 从所有目标文件构建最终共享库a.so...包括未使用的 main.o。如何防止main.o 被包含在a.so 中?

【问题讨论】:

  • 在我看来,你的整个问题来自于没有明确列出哪些文件进入了什么。我推荐使用 autotools、CMake、一个普通的 Makefile,甚至是一个 shell 脚本。但是使用一些东西。
  • 我目前正在使用一个shell脚本,它没有明确列出(大多数)文件;问题是插件是可互换的,但都与主可执行文件构建在同一个目录中,所以如果我不使用依赖项,我最终会在共享库中得到一些额外的对象。

标签: c++ linker shared-libraries ld dynamic-linking


【解决方案1】:

有没有办法为链接器提供主对象文件,并创建一个只包含它所依赖的对象的共享库?

是的:将所有对象打包到一个存档库liball.a,然后像这样链接:

gcc -shared -o a.so a.o liball.a

然后链接器将从liball.a 中提取a.o 依赖的所有对象,并且这些对象,如here 所述。

注意:liball.a 可能包含a.o,没有危害(如上链接说明)。

更新:

有没有不需要先创建存档的方法?

我不知道有任何可移植的方式来做到这一点。 Gold linker 具有 --start-lib--end-lib 命令行标志 achieve exactly that

【讨论】:

  • 这似乎正是我想要的;我的目标是创建一个包含a.o 及其依赖项的共享库(抱歉,这有点不清楚)。有没有办法在不需要先创建存档的情况下做到这一点?
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2018-10-26
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多