2015-08-16 119 views
1

为了背景,我创建了一些使用动态加载的共享库插件进行硬件输出的C++软件(具体细节与此无关)。创建最小共享库

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

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

我已经查看了连接器选项--as-needed,--gc-sections--no-undefined,但我还没有能够拼凑一个工作的构建过程。

示例:对于源文件main.cppa.cppb.cppa.h,并b.h,其中main.cppa.cpp既包括b.h

gcc -fPIC -c *.cpp -I.构建对象文件main.oa.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中?

+1

在我看来,你的整个问题来自未明确列出哪些文件进入了什么。我建议使用autotools,CMake,一个普通的旧Makefile,甚至是一个shell脚本。但是用一些东西。 –

+0

我目前使用的是一个shell脚本,它没有明确列出(大多数)文件;问题是插件是可以互换的,但是所有的插件都与主可执行文件构建在同一个目录中,所以如果我不使用依赖关系的话,我最终会在共享库中添加一些额外的对象。 – Techwolf

回答

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

+0

这似乎正是我想要的;我的目标是创建一个包含'a.o'及其依赖的共享库(对不起,这有点不清楚)。有没有办法做到这一点,而无需首先创建存档? – Techwolf