gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误

Posted

技术标签:

【中文标题】gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误【英文标题】:gtest: Undefined symbols for architecture x86_64 error with clang++ and std::vector 【发布时间】:2013-06-24 02:39:33 【问题描述】:

我下载了gtest 1.6,并用clang++编译了它。

    导出 CC=/usr/bin/clang 导出 CXX=/usr/bin/clang++ 配置 制作

我得到了 libgtest.a,并将其复制到 /usr/local/lib/libgtest_clang.a

当我使用简单的 C++ 代码进行测试时,一切正常,但是,当我尝试在测试代码中使用向量时,我在构建过程中收到了这些错误消息。编译工作正常。

Undefined symbols for architecture x86_64:
  "std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const", referenced from:
      testing::AssertionResult testing::(anonymous namespace)::IsSubstringImpl<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >(bool, char const*, char const*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) in libgtest_clang.a(gtest-all.o)
...

这是我用于构建的命令行。

clang++ -DGTEST_USE_OWN_TR1_TUPLE=1 -std=c++11 -stdlib=libc++ main.cpp test_a.cc \
-L/usr/local/lib -I. -lgtest_clang -o t

这是测试代码和被测代码。

#include <limits.h>
#include <time.h>
#include <gtest/gtest.h>
#include <list>
#include <vector>
#include <string>
#include "a.h"

using namespace std;

class QuickTest : public testing::Test 
 protected:
  virtual void SetUp() 
  
  virtual void TearDown() 
  
;

class ErrorTest : public QuickTest 
 protected:
  virtual void SetUp() 
      QuickTest::SetUp();
  

  virtual void TearDown() 
      QuickTest::TearDown();
  
;

TEST_F(ErrorTest, catchMessage2) 
    vector<int> h 1,2,3,4,5;

    for (auto& i : h) 
        A* a = new A(i);   
        EXPECT_TRUE(a->get() == i);
        delete a;
    


class A

    int x;
public:
    A(int x) : x(x) 
    void set(int x) this->x = x;
    int get() return x;
;

【问题讨论】:

【参考方案1】:

问题在于构建 gtest 时没有提供相同的编译器选项。

export CC=/usr/bin/clang
export CXX=/usr/bin/clang++
./configure 'CXXFLAGS=-std=c++11 -stdlib=libc++ -DGTEST_USE_OWN_TR1_TUPLE=1'
make

在 gtest 和源代码的新版本之后,一切正常。

【讨论】:

【参考方案2】:

只是对像我这样的白痴幸运地进行小分区的一个提示。如果你碰巧用 Apple g++ 编译 gtest。同时安装了 gcc,例如自制,链接到 gtest 将导致此错误。

所以用同一个编译器编译 gtest 和你的项目。 :D

【讨论】:

以上是关于gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误的主要内容,如果未能解决你的问题,请参考以下文章

QT-creator 中架构 x86_64 的未定义符号

架构 x86_64 / i386 的未定义符号

架构 x86_64 的未定义符号:C++ OS X 向量

架构 x86_64 的未定义符号将 QT 与 Opencv 结合使用

C++ 错误:架构 x86_64 的未定义符号

架构 x86_64 的未定义符号 - Mavericks (Yosemite, El Capitan...)