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

时间:2013-06-24 02:39:33

标签: stl clang googletest clang++

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

  1. export CC = / usr / bin / clang
  2. 导出CXX = / usr / bin / clang ++
  3. 配置
  4. 使
  5. 我得到了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;}
    };
    

2 个答案:

答案 0 :(得分:5)

问题在于构建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和源代码之后,一切正常。

答案 1 :(得分:0)

幸运的是,幸运的是像我这样的小白痴。如果您碰巧使用Apple g ++编译gtest。同时安装了gcc,例如自制软件,链接到gtest会导致此错误。

所以使用相同的编译器编译gtest和你的项目。 :d