23

もともとiOS(armv7)用に構築されたObjective-Cのビットを備えたC++の大きな静的ライブラリがあります。

OS X(64ビットIntel x86_64)バージョンを作成しましたが、OS Xアプリプロジェクト(Lion 10.7を対象)で使用しようとすると、数十のリンカーエラーが発生し、そのほとんどが標準ライブラリに関するものでした。シンボル。

私は「私の」リンカーの問題を解決する方法を知っていますが、以下にコピーされたSTDの問題は私を悩ませています。

"std::basic_filebuf<char, std::char_traits<char> >::is_open() const"
"std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const"
"std::basic_ios<char, std::char_traits<char> >::widen(char) const"
"std::istream& std::istream::_M_extract<double>(double&)"
"std::ostream::put(char)"
"std::ostream::flush()"
"std::ostream& std::ostream::_M_insert<void const*>(void const*)"
"std::ostream& std::ostream::_M_insert<bool>(bool)"
"std::ostream& std::ostream::_M_insert<double>(double)"
"std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long)"
"std::ostream::operator<<(int)"
"std::ostream::operator<<(short)"
"std::string::_Rep::_M_destroy(std::allocator<char> const&)"
"std::string::_Rep::_S_terminal"
"std::string::_Rep::_S_empty_rep_storage"
"std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)"
"std::string::append(char const*, unsigned long)"
"std::string::append(std::string const&)"
"std::string::assign(std::string const&)"
"std::string::reserve(unsigned long)"
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)"
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)"
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()"
"std::basic_ofstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)"
"std::basic_ofstream<char, std::char_traits<char> >::close()"
"std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream()"
"std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream()"
"std::_List_node_base::hook(std::_List_node_base*)"
"std::_List_node_base::unhook()"
"std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(std::string const&, std::_Ios_Openmode)"
"std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(std::_Ios_Openmode)"
"std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_stringstream()"
"std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream(std::_Ios_Openmode)"
"std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()"
"std::ios_base::Init::Init()"
"std::ios_base::Init::~Init()"
"std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)"
"std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)"
"std::_Rb_tree_decrement(std::_Rb_tree_node_base*)"
"std::_Rb_tree_increment(std::_Rb_tree_node_base const*)"
"std::_Rb_tree_increment(std::_Rb_tree_node_base*)"
"std::__throw_logic_error(char const*)"
"std::__throw_length_error(char const*)"
"std::__throw_out_of_range(char const*)"
"std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)"
"std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)"
"std::cerr"
"std::cout"

ビルド設定、プロジェクトが標準ライブラリ(-stdlib=libc++)にリンクしていることを確認し、main.cppで問題なくstd::coutを使用できます。

ビルド設定のコンパイラをAppleLLVM4.1からLLVMGCC4.2に変更したところ、問題は解決しました。AppleLLVM4.1を使い続けたい。どうすれば修正できますか?

ありがとう!

4

6 に答える 6

47

iOS 7では、チャート用のライブラリを使用していますが、同じ問題があります。この場合、libstdc++は問題を解決しません。

stdc ++。6.dylibをビルドフェーズに追加すると、シンボルが見つかります。

于 2013-10-28T18:38:46.730 に答える
45

libstdc++代わりに使用するようにリンクされている標準ライブラリを変更します-問題は、他のライブラリがライブラリを使用するモードを使用してlibc++コンパイルされたことです。g++libstdc++

次のサンプルコードを検討してください。

dhcp-191:~/Development/testy/fred% cat fred.cpp
#include <iostream>
#include <string>
#include "fred.h"

using namespace std;

bool dofred(string &x)
{
    cout << x << endl;
    return true;
}
dhcp-191:~/Development/testy/fred% cat fred.h

#include <iostream>
#include <string>

bool dofred(std::string &x);

dhcp-191:~/Development/testy/fred% clang++ -stdlib=libc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred
0000000000000fa0 T dofred(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
dhcp-191:~/Development/testy/fred% clang++ -stdlib=libstdc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred                     
0000000000000e30 T dofred(std::string&)

2つの完全に異なるエクスポートされたシンボルを取得します。シンボルを使用しようとすると、同じ-stdlibフラグを使用するアプリはリンクできますが、使用しないアプリはリンクエラーを表示します。

于 2012-10-16T18:17:26.403 に答える
11

すべてのC++ファイルを別のライブラリに配置した後、この問題が発生しました。すべてのプロジェクトの設定をlibc++を使用するように設定しましたが、リンカーはlibc++とリンクしていません。メインプロジェクトにC++ファイルを追加すると、問題は解消されます。これを修正するには、メインプロジェクトの「その他のリンカーフラグ」セクションに「-lc++」を追加します。これにより、XCodeはlibc++にリンクするように強制されます。

編集:他のポスターが言ったように、XCodeは正しく動作している可能性があります。C ++ libソースコードは同じワークスペースにあるので、C++リンケージを追加することを知っていると思っていました。

于 2013-02-13T22:20:35.313 に答える
3

同様の問題が発生したため、[ビルド設定]、[Apple LLVM 5.1-言語-C++]の順に移動し、[C++標準ライブラリ]をlibstdc++に変更する必要がありました。

于 2014-07-22T18:31:19.867 に答える
2

空の.cppファイルをプロジェクトに追加してみることもできます。これにより、xcodeがだまされてC++stdライブラリがロードされます

于 2016-06-02T20:03:40.767 に答える
0

jlukantaへの応答:私は同じ問題を抱えていました。私は正しいSTDを慎重に選択しましたが、それでもエラーが発生しました。しかし、これはバグではなく、実際には理にかなっています。プロジェクトにC ++コードがない場合、Xcodeをc++stdlibとリンクする必要があるのはなぜですか。

もちろん、これは、プロジェクトにC ++コードがなくても、C++ライブラリがある場合に問題になります。

于 2013-02-14T18:36:17.163 に答える