clang++ mac os x c++11 链接器问题
Posted
技术标签:
【中文标题】clang++ mac os x c++11 链接器问题【英文标题】:clang++ mac os x c++11 linker issue 【发布时间】:2013-05-15 09:11:30 【问题描述】:我在使用 xcode 4.6.2 中的 clang++ 在 mac os x 10.8.3 下编译带有“-std=c++11 -stdlib=libc++”的程序时遇到问题。
当我尝试使用 std::mem_fn() 或(已弃用)std::mem_fun_ref() 时,我收到链接器错误“未找到符号”。在 c++03 标准下,相同的代码(使用 std::mem_fun_ref 而不是 std::mem_fn)编译和链接没有任何问题。
如果我在对象上调用相同的成员函数而不通过 mem_fn 或 mem_fun_ref 引用它,则程序编译并运行没有任何问题。是clang++的问题,mac os的问题,还是我做错了什么?
代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char **arvc)
/* The beginning of the function compiles without any errors */
string str = "It's a test)";
if (str.empty())
cout << "String is empty!!!" << endl;
vector<string> v1;
v1.push_back("str1");
v1.push_back("str2");
v1.push_back("");
v1.push_back("str4");
v1.push_back("");
v1.push_back("str6");
/* The code after this point leads to linker error */
vector<string>::iterator it = remove_if(v1.begin(), v1.end(), mem_fn(&string::empty));
v1.erase(it, v1.end());
for (it = v1.begin(); it < v1.end(); ++it)
cout << " '" << *it << "'" << endl;
return 0;
编译日志:
$ xcrun clang++ -v -std=c++11 -stdlib=libc++ ../src/test_cxx.cpp
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.3.0
Thread model: posix
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.8.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test_cxx.cpp -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 136 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/4.2 -isysroot / -fmodule-cache-path /var/folders/nz/0x05d6p14gddzxxn8ymnn74c0000gn/T/clang-module-cache -stdlib=libc++ -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /Volumes/Work/projects/web/sp3/build -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.8.0 -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/nz/0x05d6p14gddzxxn8ymnn74c0000gn/T/test_cxx-kAQ3wk.o -x c++ ../src/test_cxx.cpp
clang -cc1 version 4.2 based upon LLVM 3.2svn default target x86_64-apple-darwin12.3.0
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/4.2/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -syslibroot / -o a.out /var/folders/nz/0x05d6p14gddzxxn8ymnn74c0000gn/T/test_cxx-kAQ3wk.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/4.2/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::empty() const", referenced from:
_main in test_cxx-kAQ3wk.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
【问题讨论】:
【参考方案1】:这是 clang 中的一个错误。我找不到关于它的错误报告。错误报告将不胜感激。
问题是string::empty
被标记为“always_inline”,而且string
模板也被标记为extern,这意味着它已经为你实例化了。
由于某种原因,当我们有这种组合,并且你形成了一个指向 always_inline 成员的成员函数指针时,clang 拒绝概述它以便它可以指向它。仅当实例化标记为 extern 时才会拒绝。
如果您禁用 extern 或 always_inline,则代码将起作用。您可以通过将其包含在“C++ 其他标志”中来禁用前者:
-D'_LIBCPP_EXTERN_TEMPLATE(...)='
【讨论】:
感谢您的回复!它有帮助! ) 不幸的是,我的英语太差了,无法正确地写错误报告。所以如果你能做到——那就太好了:)以上是关于clang++ mac os x c++11 链接器问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Mac OS X (sierra & Mojave) 中启用 OpenMP 支持
在 Mac OS X 上,通过引用传递向量还是通过值传递向量更有效?
安装了 Xcode 命令行工具的 Mac OS X 中的 clang-format 和 clang-format.py 在哪里?
使用 Mac OS X 10.8.5 Xcode 5.0.2 配置错误:clang:错误:缺少“-V”的参数(预期 1 个值)clang:错误:没有输入文件