2010-02-11 226 views
8

我试图让SCons创建一个共享库。进入.so的项目之一是一个.a静态库。SCons与静态库(.a)共享库(.so)

我有这样一句台词:

env_2.SharedLibrary('libstuff.so', \ 
    Split("""stuff.cxx mylib/libMine.a""") 

而且一旦运行它,我得到这个错误:

scons: *** Source file: mylib/libMine.a \ 
is static and is not compatible with shared target: libstuff.so 

但是,我知道,共享库可以从.a通过进行像这样的命令:

g++ -m32 -shared -o libstuff.so stuff.o mylib/libMine.a 

任何想法让这个工作或任何解决方法将大大appr eciated。


相关问题:我怎么scons的把LINK命令行上附加的字符串-sharedProgram()电话吗?如果我能做到这一点,我认为它会满足我的需求。

回答

1

此问题不是特定于scons。要构建共享库,您需要使用与位置无关的代码编译的对象(-fPIC)。您最好的选择是使用正确的选项编译源文件中的共享库。

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


更新:你的第二个问题,SharedLibrary制造商可能会做你的需要:

SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) 

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

+0

我认为你是对的。一个具有使用的.o -fPIC没有取得文件。然而,g ++ -m32共享......仍然以某种方式工作。 – xavjuan 2010-02-11 23:40:34

+1

我回去了,并且使用-fPIC编译了.a文件,但这似乎没有帮助。 – xavjuan 2010-02-12 02:08:22

+0

LINKFLAGS很有帮助。谢谢。 – xavjuan 2010-02-16 16:08:29

0
env_2.SharedLibrary('libstuff.so', Split("""stuff.cxx"""), LIBS='libMine.a', LIBPATH='mylib') 

这应该有效。

+0

这工作,但不创建依赖于'libMine.a' – shoosh 2012-11-20 09:10:15

+0

@shoosh是的,它的作用。 'SharedLibrary'构建器使用'ProgramScanner'来搜索通过'LIBS'指定的依赖关系。 – 2015-06-19 22:18:04

0

我在cygwin下有同样的问题。我通过“-fPIC”选项构建对象时,gcc和得到以下警告:

warning: -fPIC ignored for target (all code is position independent)

我也通过“-shared”的链接命令。我终于得到了错误

"***.lib is static and is not compatible with shared target: myso.dll"

看来scons的不允许这样直接从OBJ或LIB文件创建,以及一个可以从(使用SharedLibrary())或源文件的列表创建这样源文件+'LIBS'选项,如dummytaurus说。我对此很好奇。

10

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

+0

这是使它工作的魔法巫术。 – shoosh 2012-11-20 09:12:00

+1

这个'巫术巫术'也适用于我。我很惊讶,因为在添加到SConstruct之后,在编译命令选项中没有看到任何区别。我希望那个提出这个魔法的巫医解释它给我们凡人。 – 2013-02-17 20:14:28

+1

SharedLibrary构建器会检查是否所有给定的对象文件都是使用SharedObject构建器构建的(因此使用-fPIC)。 env ['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1禁用此检查。你需要自己决定这是否是一个好主意... – ElektroKraut 2014-04-22 14:20:36

1

问题出在函数SharedFlagChecker(Default.py)中,该函数仅检查内部“共享”标志。 SCons文档引导您相信它通过后缀(SHOBJSUFFIX)保留了共享对象和静态对象之间的区别,但并非如此。修复很简单。在文件scons-local.../SCons/Default.py找到SharedFlagChecker和编辑:

def SharedFlagChecker(source, target, env): 
    same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME') 
    if same == '0' or same == '' or same == 'False': 
     for src in source: 
      try: 
       shared = src.attributes.shared 
      except AttributeError: 
       # Replace this line: shared = None 
       shared = env.Dictionary()['SHOBJSUFFIX'] == src.suffix 
      if not shared: 
       raise SCons.Errors.UserError("Source file: ...") 

对象现在通过SharedObject建设者提出将在共享库可链接。

+0

你应该使用env ['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = True,而不是破解代码来禁用它。它在手册页中。 – bdbaddog 2015-06-20 01:34:18