gpt4 book ai didi

c++ - 创建一个最小的共享库

转载 作者:行者123 更新时间:2023-11-30 05:39:54 25 4
gpt4 key购买 nike

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

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

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

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

示例:对于源文件main.cpp, a.cpp, b.cpp, a.h,和b.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 中?

最佳答案

Is there a way to provide the linker with the primary object file, and create a shared library containing only the objects it depends upon?

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

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

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

注意:liball.a 可能包含a.o,没有坏处(如上链接解释)。

更新:

Is there a way to do it without needing to create an archive first?

我不知道有什么可移植的方法可以做到这一点。 Gold linker 具有 --start-lib--end-lib 命令行标志 achieve exactly that

关于c++ - 创建一个最小的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com