10

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

我有这样的一行:

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

任何关于让它工作的想法或任何解决方法都将不胜感激。


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

4

6 回答 6

13

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

于 2010-11-02T06:23:05.177 回答
2

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

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


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

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

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

于 2010-02-11T18:44:51.503 回答
0

我在cygwin下也有同样的问题。我在构建对象时将“-fPIC”选项传递给 gcc,并收到以下警告:

警告:-fPIC 忽略目标(所有代码都与位置无关)

我还将“-shared”传递给链接命令。我终于得到了错误

“***.lib 是静态的,与共享目标不兼容:myso.dll”

似乎 scons 不允许直接从 obj 或 lib 文件创建,并且可以从源文件列表(使用 SharedLibrary())或源文件 + 'LIBS' 选项(如 dummytaurus 所说)创建。我对此很好奇。

于 2010-06-20T06:09:19.433 回答
0
env_2.SharedLibrary('libstuff.so', Split("""stuff.cxx"""), LIBS='libMine.a', LIBPATH='mylib')

这应该有效。

于 2010-02-24T13:56:34.807 回答
0

问题出在函数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构建器创建的对象将可以在共享库中链接。

于 2013-02-24T06:31:32.993 回答
0

解决此问题的解决方案已使用“SharedObject”,如下所示:

ASN1CObjectFile = envCProcesses.SharedObject(target = "OTCMsg.os",
                                             source = "OTCMsg.c",
                                             CFLAGS = envCProcesses["CFLAGS"] + ["-Wno-unused"])

和:

OTCLibSharedLibrary = envCProcesses.SharedLibrary(env["OTC_LIBPATH"] + "/libOTCLib" + env["SHLIBSUFFIX"],
                                              ASN1CObjectFile +
                                              [ASN1AllocatorSource,
                                               "OTCLib.c"],
                                              LIBPREFIX = "")

此致,

于 2018-07-30T20:22:38.723 回答