googletest Undefined symbols for architecture x86_64 error

匿名 (未验证) 提交于 2019-12-03 01:25:01

问题:

Let GTEST_DIR be the environment variable storing the path to the googletest directory. (I cloned googletest-master from googletest's github repo.)

I cd'ed into $GTEST_DIR, did a mkdir build && cd build, then executed the following command :

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 

where GNU-6.0.0 is the path to my gnu install. This generated a Makefile inside $GTEST_DIR/build that I tweaked as follows : I've added

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

at its beginning, to be sure that the c and c++ compilers that will be used will be those I want to be used. Then I ran make which produced archive files libgtest.a and libgtest_main.a inside $GTEST_DIR/build.

Next step : in a same folder I put a main test source file main.cpp containg :

#include "path/to/gtest.h"  int main(int argc, char* argv[]) {     ::testing::InitGoogleTest(&argc,argv);     return RUN_ALL_TESTS(); } 

and a dummy test dummy_test.cpp containing :

#include "path/to/gtest.h"  TEST(dummy_test, test1) {     EXPECT_EQ(1,1); } 

and a Makefile containing :

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 

Running make I have this output :

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

The entire output is in this snippet while the output of nm libgtest.a is in this snippet.

Precision : I am under mac os x 10.10.5. As I want to continue working, developping code and testing it, while the aforementionned error with gcc/g++ 6.0.0 is solved, I tried to switch to another compiler : clang, and I remarked that I had no error at all with it.

Remark libgtest.a was initially (that is, before I asked this question) built "by error" with clang and used in tests with g++-6.1.0 when I encountered the error, that's why I decided to rebuild libgtest.a with g++-6.1.0, thinking that it would solve the problem, but it didn't, which led me to post here.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!