在xcode 4.5.2中编译带有c++ 11支持的混合objective-C/ c++项目时出现链接错误

Link errors compiling a mixed objective-C/C++ project with C++11 support in xcode 4.5.2

本文关键字:c++ objective-C 项目 混合 错误 链接 xcode 编译 支持      更新时间:2023-10-16

我正在尝试用c++ 11支持编译3个项目的工作空间。这组项目已经使用LLVM编译器默认值成功编译和链接。此外,c++代码之前已经在许多编译器上编译过,包括g++, llvm, msvc, sun, irix等,所以它是非常干净的代码。

在工作空间构建设置的c++语言方言部分有3行条目:

c语言方言
c++语言方言
c++标准库

使用设置:

c语言方言:编译器默认值
c++语言方言:编译器默认值
c++标准库:libc++(支持c++11的LLVM c++标准库)

我可以成功编译,但得到许多链接错误。有些来自我们自己的函数,有些来自标准函数。下面是一个标准函数的链接错误示例:

(null): "std::string::find_last_of(char const*, unsigned long) const",引用自:(null): "std::string::size() const",引用自:

很明显,我链接到了错误的标准库,所以我研究了改变上面的各种选项。将方言更改为-std=c++11甚至破坏了我的编译。我找不到适合我的组合。

你能指出哪里出了问题吗?

编辑:我这样做的动机是我想在我的c++代码中使用std::线程与objective-c接口(并使c++代码仍然是可移植的)

XCode 4.5.2/OSX 10.8.2

我一直在得到这些

(null): "std::string::find_last_of(char const*, unsigned long) const", 
 referenced from: (null):    "std::string::size() const", referenced from:

不同版本的openCV库。问题似乎在于对c++标准库的访问。在这种情况下,工作设置如下:

旧库版本:

C Language Dialect GNU99[-std=gnu99]
C++ Language Dialect GNU++11[-std=gnu++11]
C++ Standard Library libstdc++ (GNU C++ standard library)

最近的库版本:

C Language Dialect GNU99[-std=gnu99]
C++ Language Dialect GNU++11[-std=gnu++11]
C++ Standard Library libc++ (LLVM C++ standard library with C++11 support)

将标准库规范切换到任何一个版本都会产生这些错误。

我最终将问题归结为两件事

1)尽管我在工作空间级别设置了编译器选项,但这些选项并没有被传播到组成项目。要注意的事情!所以实际上不同的项目是用不同的编译器库和方言编译的——所以有链接错误并不奇怪。对我有用的选项组合是:

C语言方言编译器默认值
c++语言方言 -std=c++11
c++标准库 libc++(支持c++ 11的LLVM c++标准库)

2)在c++11编译下,我的一个项目无法编译。修复语法错误后,它使用上面的选项

进行编译和链接。

当使用代码5时,我有一个类似的问题

Undefined symbols for architecture armv7:
"std::string::clear()", referenced from:
FormatLog(unsigned int, int, char const*, std::string&) in libMO.a(AppLog.o)

将"部署目标"从7.0更改为6.0帮助了我。

对于XCode 4.5,似乎必须使用LLVM C++ with C++11 support编译器而不是GNU C++编译器用于c++标准库。