2017-02-19 2 views
2

C++のLinuxでは、一連のコードを静的なlib(.a)にリンクすることで共有ライブラリを構築しています。私は静的ライブラリで定義されたメソッドを持っています。私は静的ライブラリ内のシンボルを印刷するNM -Cを使用する場合であるとして表示されます。C++静的ライブラリのstd :: stringに関連する未定義のシンボル

Alembic::AbcCoreFactory::v9::IFactory::getArchive(std::string const&, Alembic::AbcCoreFactory::v9::IFactory::CoreType&) 

シンボルがファイル(私が構築していますライブラリ)の.so出力で定義されていないが、私は未定義の一覧を表示するときNMを使用してシンボル-ucそれが印刷:

Alembic::AbcCoreFactory::v9::IFactory::getArchive(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Alembic::AbcCoreFactory::v9::IFactory::CoreType&) 

差一つの第一の使用のstd ::文字列CONST &さと第二のSTD :: __ 1 ::のbasic_string、STD :: __ 1 ::アロケータ> CONST &を使用

なぜそれがいいのか理解しようとしていますシンボルを見つける。彼らは本質的に同じなので、2人は一致してはいけませんか?

私は、Unreal Editor 4 for Linuxに付属のAlembic Importerをコンパイルしようとしています。私がリンクしようとしているライブラリは、alembicライブラリです。

+0

あなたの質問は不明です。 「Linux上で静的なlib(.a)を共有lib(.so)にリンクするのはどういう意味ですか?既存の.aファイルを取得し、それを.soファイルに再リンクしていますか? .aファイルを既存の.soファイルにリンクしていますか?あなたが "静的なlib"ファイルをリンクしている場合、 "出力.soファイル"はどこから来たのでしょうか?あなたはあなたの質問をより明確にする必要があります。 –

+1

libstdC++とlibC++のようなものにできますか? .aをビルドするときと同じように '-stdlib = libstdC++'を使い、.soをビルドするときには '-stdlib = libC++'あるいはその逆です。 – Paul

+0

応答いただきありがとうございます。私はUnreal Editor用のプラグインを作成しています。これは共有lib(最終出力.so)です。その共有ライブラリは静的ライブラリに依存しています。だから私は、コードと既存の.aファイルの束から新しい.soを作成しています。 – Luke

答えて

3

libc++(clangの標準C++ライブラリ)とlibstdc++(gccの標準C++ライブラリ)に対してコンパイルされたコードをリンクしようとしています。これはあまりうまくいきません。

あなたのライブラリと比較して確認してください。私のシステムで

:お使いのシステムに

> nm -DC /usr/lib64/libc++_shared.so | grep 'std::__1' 
    === lots of output === 
> nm -DC /usr/lib64/libc++_shared.so | grep 'std::basic' 
    === nothing === 
> nm -DC /usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/libstdc++.so.6 | grep 'std::__1' 
    === nothing === 
> nm -DC /usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/libstdc++.so.6 | grep 'std::basic' 
    === lots of output === 

ファイルが異なる場所が、結果寿であってもよく、同一であるdは。

+0

私はあなたが正しいと思います。十分な評判があればアップヴォートします。ありがとう! – Luke

関連する問題