gtest: неопределенные символы для архитектуры x86_64 ошибка с clang++ и std::vector

Я скачал gtest 1.6 и скомпилировал его с помощью clang++.

  1. экспорт CC=/usr/bin/clang
  2. экспортировать CXX=/usr/bin/clang++
  3. настроить
  4. сделать

Я получил 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;}
};

person prosseek    schedule 24.06.2013    source источник


Ответы (2)


Проблема заключалась в том, что при сборке 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 и исходников все работает нормально.

person prosseek    schedule 24.06.2013

Просто намек на, к счастью, незначительную долю таких идиотов, как я. Если вам случится скомпилировать gtest с Apple g++. А тем временем установил gcc, например. homebrew, ссылка на gtest вызовет эту ошибку.

Поэтому скомпилируйте gtest и ваш проект одним и тем же компилятором. :D

person ManuelSchneid3r    schedule 07.01.2014