【问题标题】:Link errors compiling a mixed objective-C/C++ project with C++11 support in xcode 4.5.2在 xcode 4.5.2 中使用 C++11 支持编译混合目标 C/C++ 项目时出现链接错误
【发布时间】:2012-12-24 04:09:40
【问题描述】:

我正在尝试编译具有 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::thread 与 Objective-c 接口(并且让该 c++ 代码仍然是可移植的)

【问题讨论】:

  • 我遇到了这些错误... [对不起,我会改写为答案..] 同时您使用的是最新的 Xcode 和 OSX 吗?
  • 我认为site 很好地解释了这一点。我最近被困在这个问题上,发现它很有帮助。

标签: c++ xcode c++11 linker c++-standard-library


【解决方案1】:

在使用 Code 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++ 标准库编译器。

【讨论】:

    【解决方案2】:

    我终于把问题归结为两件事

    1) 尽管我在工作区级别设置了编译器选项,但这些选项并未传播到组成项目。 需要注意的一点! 所以实际上不同的项目是用不同的编译器库和方言集编译的——所以出现链接错误也就不足为奇了。对我有用的选项组合是:

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

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

    【讨论】:

      【解决方案3】:

      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)
      

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

      【讨论】:

        猜你喜欢
        • 2013-07-28
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多