【问题标题】:googletest Undefined symbols for architecture x86_64 errorgoogletest 架构 x86_64 错误的未定义符号
【发布时间】:2016-12-12 15:43:18
【问题描述】:

GTEST_DIR 成为存储googletest 目录路径的环境变量。 (我从 googletest's github repo 克隆了 googletest-master。)

cd'ed 到$GTEST_DIR,做了一个mkdir build && cd build,然后执行以下命令:

cmake .. -DCMAKE_C_COMPILER=$GNU-6.0.0/bin/gcc-6.0.0 -DCMAKE_CXX_COMPILER=$GNU-6.0.0/bin/g++-6.0.0

GNU-6.0.0 是我的 gnu 安装路径。这在$GTEST_DIR/build 内生成了一个Makefile,我对其进行了如下调整:我已添加

CC = $GNU-6.0.0/bin/gcc-6.0.0
CXX = $GNU-6.0.0/bin/g++-6.0.0

在开始时,要确保将使用的 c 和 c++ 编译器将是我想要使用的那些。然后我运行make,它在$GTEST_DIR/build 中生成了归档文件libgtest.alibgtest_main.a

下一步:在同一个文件夹中,我将一个主测试源文件main.cpp 包含:

#include "path/to/gtest.h"

int main(int argc, char* argv[])
{
    ::testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

还有一个虚拟测试 dummy_test.cpp 包含:

#include "path/to/gtest.h"

TEST(dummy_test, test1)
{
    EXPECT_EQ(1,1);
}

和一个 Makefile 包含:

CC = gcc-6.0.0
CXX = g++-6.0.0

CPPFLAGS += -isystem $(GTEST_DIR)/include
LDFLAGS := -L/usr/lib -lpthread -L$(GTEST_DIR)/build -lgtest

all :
    $(CXX) -o cpptests $(CPPFLAGS) ./main.cpp ./dummy_test.cpp $(LDFLAGS)

clean :
    rm -rf ./cpptests

运行make 我有这个输出:

Undefined symbols for architecture x86_64:
  "std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::end() const", referenced from:
      testing::internal::XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in libgtest.a(gtest-all.cc.o)
  "std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::data() const", referenced from:
      testing::internal::PrintStringTo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_ostream<char, std::char_traits<char> >*) in libgtest.a(gtest-all.cc.o)
      __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in libgtest.a(gtest-all.cc.o)
  "std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long) const", referenced from:
      bool testing::(anonymous namespace)::IsSubstringPred<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in libgtest.a(gtest-all.cc.o)
  "std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char, unsigned long) const", referenced from:
      testing::internal::SplitString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*) in libgtest.a(gtest-all.cc.o)
      testing::internal::FormatDeathTestOutput(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in libgtest.a(gtest-all.cc.o)
  "std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const", referenced from:
      testing::internal::(anonymous namespace)::SplitEscapedString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in libgtest.a(gtest-all.cc.o)

...

      ...
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

整个输出在this snippet,而nm libgtest.a的输出在this snippet

精度:我在mac os x 10.10.5下。由于我想继续工作,开发代码并对其进行测试,同时解决了gcc/g++ 6.0.0 的上述错误,我尝试切换到另一个编译器:clang,我说我没有完全错误。

备注 libgtest.a 最初(即在我问这个问题之前)是用clang“错误”构建的,并在我遇到错误时用g++-6.1.0 进行测试,那就是为什么我决定用g++-6.1.0 重建libgtest.a,以为它会解决问题,但它没有,这导致我在这里发帖。

【问题讨论】:

  • 您的程序的某些部分(包括第 3 方库)是使用 -std=c++11 构建的,而有些则没有。让他们都排队。参见例如this
  • 好吧,我用-DCMAKE_C_COMPILER=$GNU-6.0.0/bin/gcc-6.0.0 -DCMAKE_CXX_COMPILER=$GNU-6.0.0/bin/g++-6.0.0 -D_GLIBCXX_USE_CXX11_ABI=1代替cmake,把$(CXX) = g++-6.0.0 -DCMAKE_CXX_FLAGS=-D_GLIBCXX_USE_CXX11_ABI=1放在cmake生成的Makefile中,对我的假人Makefile做了同样的事情,最后得到了同样的错误。
  • 别等了,你在哪里链接你的程序?命令在哪里?
  • 我使用术语 linking 是错误的,唯一的命令是 $(CXX) $(CPPFLAGS) -I$(GTEST_DIR)/include $(LDFLAGS) -lgtest -lpthread ./main.cpp ./dummy_test.cpp -o cpptestsLDFLAGS := -lpthread -L/usr/lib -L$(GTEST_DIR)/build -lgtest
  • “因为我在 mac os x 下,如果我使用的是 gnu 的 gcc/g++ 6.0.0,我使用 clang 的,我没有这个错误,并且一切正常。”尝试将-stdlib=libstdc++ 添加到您的 CXX 和 LD 标志中。

标签: c++ cmake g++ gnu-make googletest


【解决方案1】:

问题似乎是由于一些链接问题。您是否正确使用了链接器标志。对于gtest,我们需要用-lgtest编译,链接器才能正确链接。同样,我们需要为我们链接的所有可能的库提供标志。

代码

TEST(dummy_test, test1) { EXPECT_EQ(1,1); }

int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); 返回 RUN_ALL_TESTS(); }

用命令完美地为我编译

clang++ -std=c++11 main.cpp -lgtest

我可以毫无问题地运行单个测试。

【讨论】:

    【解决方案2】:

    我收到以下错误

    Undefined symbols for architecture x86_64:
      "_main", referenced from:
         implicit entry/start for main executable
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    使用命令

    /usr/bin/g++ -g testgoogletestsetup.cpp -std=c++11 -o testgoogletestsetup -lgtest

    解决方案:
    需要链接库 gtest_main(以及库 gtest)才能成功编译它。为此,将链接器标志提供为 -lgtest_main,如下面的命令所示。

    /usr/bin/g++ -g testgoogletestsetup.cpp -std=c++11 -o testgoogletestsetup -lgtest -lgtest_main

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 2017-02-15
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2014-05-14
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多