STD链接器错误与Apple LLVM 4.1 [英] STD linker error with Apple LLVM 4.1

查看:240
本文介绍了STD链接器错误与Apple LLVM 4.1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我在C ++中有一个大型静态库,它的Objective-C最初是为iOS(armv7)构建的。 bit Intel x86_64)版本,但是一旦我试图在OS X应用程序项目中使用它(针对Lion 10.7),几十个链接器错误出现,其中大多数关于标准库符号。



我知道如何解决我的链接器问题,但下面复制的STD正在欺骗我。

 std :: basic_filebuf std :: basic_stringbuf< char,std :: char_traits& :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 b $ bstd :: ostream& std :: ostream :: _ M_insert< void const *>(void const *)
std :: ostream& std :: ostream :: _ M_insert< 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 ++ ),我可以使用std :: cout没有任何问题在我的main.cpp。



我更改了编译器设置从Apple LLVM 4.1到LLVM GCC 4.2和问题消失。
我想继续使用Apple LLVM 4.1。如何解决这个问题?



谢谢!

解决方案

更改链接的标准库使用 libstdc ++ 而不是 libc ++ - 问题是其他库是使用 g ++使用 libstdc ++ 库的模式。



考虑下面的示例代码: p>

  dhcp-191:〜/ Development / testy / fred%cat fred.cpp 
#include< iostream>
#include< string>
#includefred.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&)

导出符号。当尝试使用该符号时,使用相同 -stdlib 标志的应用程序将能够链接,而不会显示链接错误的应用程序。 p>

I've got a large static library in C++ with bits of Objective-C originally built for iOS (armv7).

I built a OS X (64-bit Intel x86_64) version of it, but as soon as I tried to use it in a OS X app project (targeted to Lion 10.7), tens of linker errors appeared, most of them about standard library symbols.

I know how to solve "my" linker problems, but the STD ones copied below are bugging me.

"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"

I checked my build settings, my project links to the standard library (-stdlib=libc++) and I can use std::cout without any problem in my main.cpp.

I changed the compiler in the build settings from Apple LLVM 4.1 to LLVM GCC 4.2 and the problem disappeared. I want to keep using Apple LLVM 4.1. How can I fix that?

Thanks!

解决方案

Change the standard library that is linked to use libstdc++ instead of libc++ - the problem is that the other library was compiled using the g++ mode which uses the libstdc++ library.

Consider the following sample code:

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&)

You get two completely different exported symbols. When trying to use the symbol, the app that uses the same -stdlib flag will be able to link, while the app that doesn't will display a link error.

这篇关于STD链接器错误与Apple LLVM 4.1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆