10

SCons に共有ライブラリを作成させようとしています。に入る項目の 1 つは.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

これを機能させるためのアイデアや回避策は大歓迎です。


-shared関連する質問: 呼び出しの LINK コマンド ラインに追加の文字列を配置するように scons を取得するにはどうすればよいProgram()ですか? これができれば、私のニーズを満たすことができると思います。

4

6 に答える 6

13

env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME']=1SConstruct で設定してみてください。

于 2010-11-02T06:23:05.177 に答える
2

この問題は、scons に固有のものではありません。共有ライブラリを構築するには、位置に依存しないコード ( -fPIC) でコンパイルされたオブジェクトが必要です。最善の策は、適切なオプションでコンパイルされたソース ファイルから共有ライブラリを作成することです。

SCons では、libMine.a と libShared.so の両方をビルドするために使用されるターゲットのリストを定義できます。


更新: 2 番目の質問については、SharedLibraryビルダーが必要なことを行う可能性があります。

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

そうでない場合は、LINKFLAGSリンク コマンドに渡されるフラグを設定します。

于 2010-02-11T18:44:51.503 に答える
0

cygwinでも同じ問題が発生します。オブジェクトをビルドするときに「-fPIC」オプションをgccに渡したところ、次の警告が表示されました。

警告:-fPICはターゲットに対して無視されます(すべてのコードは位置に依存しません)

また、linkコマンドに「-shared」を渡しました。そしてついにエラーが発生しました

「***。libは静的であり、共有ターゲットと互換性がありません:myso.dll」

sconsはobjまたはlibファイルから直接作成することを許可していないようで、ソースファイルのリスト(SharedLibrary()を使用)またはソースファイル+'LIBS'オプションから作成できます(dummytaurusが言うように)。私はそれについて興味があります。

于 2010-06-20T06:09:19.433 に答える
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
env_2.SharedLibrary('libstuff.so', Split("""stuff.cxx"""), LIBS='libMine.a', LIBPATH='mylib')

これはうまくいくはずです。

于 2010-02-24T13:56:34.807 に答える