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