【问题标题】:undefined reference to std::basic_string对 std::basic_string 的未定义引用
【发布时间】:2013-07-03 04:27:27
【问题描述】:

我正在编译我的项目并看到链接问题

$ g++ -Wl,-z,now -Wl,-z,relro -pthread -Wl,-z,noexecstack -fPIC -Wl,--threads -Wl,--thread-count=4 -B../../third_party/gold -L. -Wl,-uIsHeapProfilerRunning,-uProfilerStart -Wl,-u_Z21InitialMallocHook_NewPKvj,-u_Z22InitialMallocHook_MMapPKvS0_jiiix,-u_Z22InitialMallocHook_SbrkPKvi -Wl,-u_Z21InitialMallocHook_NewPKvm,-u_Z22InitialMallocHook_MMapPKvS0_miiil,-u_Z22InitialMallocHook_SbrkPKvl -Wl,-u_ZN15HeapLeakChecker12IgnoreObjectEPKv,-u_ZN15HeapLeakChecker14UnIgnoreObjectEPKv -Wl,--icf=none -Wl,-rpath=\$ORIGIN/lib/ -Wl,-rpath-link=lib/ -o cameo -Wl,--start-group obj/cameo/src/runtime/app/cameo.cameo_main.o obj/media/libmedia_sse.a ...(omitted many *.a here) -Wl,--end-group -lX11 -lXcursor -lXrandr -lXrender -lrt -ldl -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lXtst -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lXi -lXcomposite -lasound -lXdamage -lXext -lXfixes -lnss3 -lnssutil3 -lsmime3 -lplds4 -lplc4 -lnspr4 -lgconf-2 -lresolv -ldbus-1 -lcups -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lgnutls -lgcrypt -lz -lpthread -lm -lcrypt -L/lib/x86_64-linux-gnu -lexpat -ludev
/usr/include/c++/4.7/ext/new_allocator.h:110: error: undefined reference to 'std::basic_string<unsigned short, base::string16_char_traits, std::allocator<unsigned short> >::basic_string(std::basic_string<unsigned short, base::string16_char_traits, std::allocator<unsigned short> >&&)'
/usr/include/c++/4.7/bits/stl_construct.h:77: error: undefined reference to 'std::basic_string<unsigned short, base::string16_char_traits, std::allocator<unsigned short> >::basic_string(std::basic_string<unsigned short, base::string16_char_traits, std::allocator<unsigned short> >&&)'
error: ld returned 1 exit status

我的 gcc 库中的std::basic_string 符号如下:

$ find /usr -name libstdc++.a
/usr/lib/gcc/x86_64-linux-gnu/4.6/32/libstdc++.a
/usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a
/usr/lib/gcc/x86_64-linux-gnu/4.7/32/libstdc++.a
/usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a

$ nm -C /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a| grep basic_string | grep '&&'
nm: compatibility-debug_list-2.o: no symbols
nm: compatibility-list-2.o: no symbols
nm: compatibility-parallel_list-2.o: no symbols
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::assign(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator=(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 n std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&)
0000000000000000 W std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&)
0000000000000000 W std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&)
0000000000000000 n std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&)

我该如何解决这个问题?

--编辑--

在我从编译命令中删除-std=gnu++11 后问题得到解决。看来 string16 的 Chromium 基础库与 C++11 存在兼容性问题。

【问题讨论】:

  • basic_string 是一个模板。问:您是否在程序中的任何地方实例化了它?你如何使用它?你能从你的代码中剪切和粘贴一个例子吗?
  • 看起来像一个宽字符问题(wchar_t 用于实例化)。
  • @paulsm4 刚搜了我的代码,没有basic_string实例化
  • 应该是std::wstring,你有#include &lt;string&gt;吗?
  • 对于std::basic_string&lt;T&gt; 的各种值T 有typedef,例如string, wstring, string16 (c++11),需要自己去搜索。

标签: c++ gcc c++11 linker g++


【解决方案1】:

您正在尝试使用basic_string&lt;unsigned short, base::string16_char_traits&gt;,但它不是来自标准库,libstdc++.so 库仅包含 basic_string&lt;char&gt;basic_string&lt;wchar_t&gt;

该专业化必须在您正在使用的库之一中使用,因此您应该找出哪个库并确保正确链接到它。如果您使用 -fno-implicit-templates 进行编译,那么您可能需要显式实例化。

查找base::string16_char_traits 以查找实例化的来源可能会有所帮助。快速的 Google 表明它来自 Chromium 库,因此您可能没有链接到该库,或者您可能需要稍后将该库放入链接命令中。

【讨论】:

  • 谢谢。事实上,我的项目是基于 Chromium 代码的。那么如何添加这个库呢?
  • 这个库好像叫base。但是我可以看到obj/base/libbase.a已经包含在g++链接器命令中了。
  • “也许您需要稍后将该库放在链接命令中。” - 该库必须列在所有依赖它的对象之后。
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 2017-04-04
  • 2021-07-19
  • 2016-11-11
  • 2015-03-29
相关资源
最近更新 更多