为了背景,我创建了一些使用动态加载的共享库插件进行硬件输出的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
中?
在我看来,你的整个问题来自未明确列出哪些文件进入了什么。我建议使用autotools,CMake,一个普通的旧Makefile,甚至是一个shell脚本。但是用一些东西。 –
我目前使用的是一个shell脚本,它没有明确列出(大多数)文件;问题是插件是可以互换的,但是所有的插件都与主可执行文件构建在同一个目录中,所以如果我不使用依赖关系的话,我最终会在共享库中添加一些额外的对象。 – Techwolf