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

创建最小共享库 背景,我正在创建一些C++软件,它使用动态加载的共享库插件来进行硬件输出(这里的细节不相关)。,c++,linker,shared-libraries,ld,dynamic-linking,C++,Linker,Shared Libraries,Ld,Dynamic Linking,我通过将所有内容编译成目标文件,然后链接所需的文件来构建可执行文件,使用排除列表很简单。然后,我可以通过指定共享库的主对象文件(在运行时动态加载和访问的文件)以及主对象文件引用的所有其他对象文件来构建共享库 我的问题是:有没有办法向链接器提供主对象文件,并创建一个只包含它所依赖的对象的共享库?所有的对象文件都在同一个目录中,我没有使用Makefile(不过,如果有人能解决这个问题,这是一个有效的答案),编译速度也不是问题 我已经研究了链接器选项--根据需要,--gc部分,以及--没有未定义的,但

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

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

我已经研究了链接器选项
--根据需要
--gc部分
,以及
--没有未定义的
,但是我还没有能够拼凑出一个工作的构建过程

示例:对于源文件
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部分
应修复此问题。)

gcc-fPIC-shared-oa.so a.o-Wl,--根据需要!(a) .o
从所有对象文件构建最终的共享库
a.so
包括未使用的main.o。如何防止
main.o
包含在
a.so

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

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

gcc -shared -o a.so a.o liball.a
然后链接器将从
liball.a
中拉出
a.o
所依赖的所有对象,并且仅限于这些对象,如前所述

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

更新:

有没有一种不需要先创建归档的方法


我不知道有什么便携式方法可以做到这一点。有
--start-lib
--end-lib
命令行标志,

这似乎正是我想要的;我的目标是创建一个包含
a.o
及其依赖项的共享库(抱歉,这有点不清楚)。有没有一种不需要先创建归档文件的方法呢?在我看来,您的整个问题都源于没有明确列出哪些文件要放入哪些文件中。我建议使用autotools、CMake、普通的旧Makefile,甚至是shell脚本。但是使用一些东西。我目前正在使用一个shell脚本,它没有明确列出(大多数)文件;问题是这些插件可以互换,但都与主可执行文件构建在同一个目录中,因此如果不使用依赖项,我最终会在共享库中添加一些额外的对象。