对于后台,我正在创建一些C ++软件,它使用动态加载的共享库插件来进行硬件输出(这里的细节与此无关)。
我正在构建可执行文件,将所有内容编译为目标文件,然后链接所需的文件,这很简单,使用排除列表。然后,我可以通过指定其主要目标文件(在运行时动态加载和访问的文件)以及主要文件引用的每个其他目标文件来构建共享库。
我的问题是:有没有办法为链接器提供主对象文件,并创建一个只包含它依赖的对象的共享库?所有目标文件都在同一个目录中,我没有使用Makefile(但是;如果可以解决问题,这是一个有效的答案),编译速度不是问题。
我查看了链接器选项--as-needed
,--gc-sections
和--no-undefined
,但我无法拼凑出有效的构建过程。
示例:对于源文件main.cpp
,a.cpp
,b.cpp
,a.h
和b.h
,其中main.cpp
和{{1}两者都包括a.cpp
:
b.h
构建对象文件gcc -fPIC -c *.cpp -I.
,main.o
和a.o
。
b.o
从目标文件中构建最终的可执行文件gcc -o main.out *.o
... 包括未使用的ao。(main.out
应解决此问题。)< / p>
--gc-sections
从所有目标文件构建最终共享库gcc -fPIC -shared -o a.so a.o -Wl,--as-needed !(a).o
... 包括main.o,未使用。如何阻止a.so
中包含main.o
?
答案 0 :(得分: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。