SCons使用静态库(.a)创建共享库(.so)

xav*_*uan 9 static portability scons static-libraries static-linking

我正在尝试让SCons创建一个共享库.进入的.so一个项目是.a静态库.

我有一句话:

env_2.SharedLibrary('libstuff.so', \
  Split("""stuff.cxx mylib/libMine.a""")
Run Code Online (Sandbox Code Playgroud)

在运行它时,我收到此错误:

scons: *** Source file: mylib/libMine.a \
is static and is not compatible with shared target: libstuff.so
Run Code Online (Sandbox Code Playgroud)

但是,我知道共享库可以.a通过命令来制作,如:

g++ -m32 -shared -o libstuff.so stuff.o mylib/libMine.a
Run Code Online (Sandbox Code Playgroud)

任何关于让这个工作或任何变通方法的想法将不胜感激.


相关问题:如何让scons -shared在LINK命令行上添加一个额外的字符串进行Program()调用?如果我能做到这一点,我认为它会满足我的需求.

小智 11

尝试env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME']=1在SConstruct中设置.


Dav*_*her 2

这个问题并不是 scons 特有的。要构建共享库,您需要使用位置无关代码 ( -fPIC) 编译的对象。最好的选择是使用正确的选项编译源文件来创建共享库。

在 SCons 中,您可以定义用于构建 libMine.a 和 libShared.so 的目标列表。


更新:对于你的第二个问题,SharedLibrary构建器可能会满足你的需要:

SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
Run Code Online (Sandbox Code Playgroud)

如果没有,LINKFLAGS则设置传递给链接命令的标志。