繁体   English   中英

创建一个最小的共享库

[英]Creating a Minimal Shared Library

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

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

我的问题是:是否可以为链接程序提供主要目标文件,并创建仅包含其依赖的对象的共享库? 所有的目标文件都在同一个目录中,我没有使用Makefile(但是,如果可以解决问题,那是一个有效的答案),并且编译速度也不是问题。

我已经研究了链接器选项--as-needed ,- --gc-sections--no-undefined ,但是我无法将有效的构建过程组合在一起。

示例:对于源文件main.cppa.cppb.cppahbh ,其中main.cppa.cpp都包含bh

gcc -fPIC -c *.cpp -I. 构建目标文件main.oaobo

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

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

有没有办法为链接器提供主要目标文件,并创建一个仅包含其依赖的对象的共享库?

是:将所有对象打包到存档库liball.a ,然后按如下所示链接:

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

然后,连接器就会根据拉出liball.a所有对象ao取决于, 只有这些对象,说明这里

注意: liball.a可能包含ao ,没有任何危害(如上面的链接所述)。

更新:

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

我不知道有什么便携式方法可以做到这一点。 Gold链接器具有--start-lib--end-lib命令行标志,可以实现该目标

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM