创建一个最小的共享库
Creating a Minimal Shared Library
作为背景,我正在创建一些 C++ 软件,这些软件使用动态加载的共享库插件进行硬件输出(它的细节在这里不相关)。
我正在构建可执行文件,方法是将所有内容编译到目标文件中,然后链接所需的文件,使用排除列表很简单。然后,我可以通过指定其主目标文件(在运行时动态加载和访问的目标文件)以及主目标文件引用的所有其他目标文件来构建共享库。
我的问题是:有没有办法为链接器提供主要目标文件,并创建一个仅包含它所依赖的对象的共享库?所有目标文件都在同一个目录中,我没有使用 Makefile(目前;如果可以解决问题,这是一个有效的答案),编译速度不是问题。
我查看了链接器选项 --as-needed
、--gc-sections
和 --no-undefined
,但我无法拼凑出一个有效的构建过程。
示例:对于源文件 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-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
,然后link像这样:
gcc -shared -o a.so a.o liball.a
然后 linker 将从 liball.a
中取出 a.o
依赖的所有对象,并且 仅 这些对象,如所解释的here.
注意:liball.a
可能包含a.o
,没有害处(如上link说明)。
更新:
Is there a way to do it without needing to create an archive first?
我不知道有什么可移植的方法可以做到这一点。 Gold linker has --start-lib
and --end-lib
command line flags that achieve exactly that.
作为背景,我正在创建一些 C++ 软件,这些软件使用动态加载的共享库插件进行硬件输出(它的细节在这里不相关)。
我正在构建可执行文件,方法是将所有内容编译到目标文件中,然后链接所需的文件,使用排除列表很简单。然后,我可以通过指定其主目标文件(在运行时动态加载和访问的目标文件)以及主目标文件引用的所有其他目标文件来构建共享库。
我的问题是:有没有办法为链接器提供主要目标文件,并创建一个仅包含它所依赖的对象的共享库?所有目标文件都在同一个目录中,我没有使用 Makefile(目前;如果可以解决问题,这是一个有效的答案),编译速度不是问题。
我查看了链接器选项 --as-needed
、--gc-sections
和 --no-undefined
,但我无法拼凑出一个有效的构建过程。
示例:对于源文件 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-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
,然后link像这样:
gcc -shared -o a.so a.o liball.a
然后 linker 将从 liball.a
中取出 a.o
依赖的所有对象,并且 仅 这些对象,如所解释的here.
注意:liball.a
可能包含a.o
,没有害处(如上link说明)。
更新:
Is there a way to do it without needing to create an archive first?
我不知道有什么可移植的方法可以做到这一点。 Gold linker has --start-lib
and --end-lib
command line flags that achieve exactly that.