【发布时间】:2015-08-16 06:13:14
【问题描述】:
作为背景,我正在创建一些 C++ 软件,它使用动态加载的共享库插件来进行硬件输出(这里不涉及它的细节)。
我通过将所有内容编译成目标文件然后链接所需的文件来构建可执行文件,这很简单,使用排除列表。然后,我可以通过指定其主要目标文件(在运行时动态加载和访问的目标文件)以及主要目标文件引用的所有其他目标文件来构建共享库。
我的问题是:有没有办法为链接器提供主对象文件,并创建一个只包含它所依赖的对象的共享库?所有的目标文件都在同一个目录中,我没有使用 Makefile(还没有;如果可以解决问题,这是一个有效的答案),编译速度不是问题。
我查看了链接器选项 --as-needed、--gc-sections 和 --no-undefined,但我无法拼凑出一个有效的构建过程。
例如:对于源文件main.cpp、a.cpp、b.cpp、a.h和b.h,其中main.cpp和a.cpp都包含b.h:
gcc -fPIC -c *.cpp -I. 构建目标文件main.o、a.o 和b.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