让GTEST_DIR
成为存储googletest
目录路径的环境变量。 (我从googletest's github repo克隆了googletest-master。)
我cd
'加入$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安装的路径。这在Makefile
内生成$GTEST_DIR/build
我调整如下:我添加了
CC = $GNU-6.0.0/bin/gcc-6.0.0
CXX = $GNU-6.0.0/bin/g++-6.0.0
一开始,确保将要使用的c和c ++编译器将是我想要使用的编译器。然后我运行make
,在libgtest.a
内生成了归档文件libgtest_main.a
和$GTEST_DIR/build
。
下一步:在同一文件夹中,我将主要测试源文件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
的测试中使用我遇到了错误,这就是为什么我决定用libgtest.a
重建g++-6.1.0
,认为它会解决问题,但事实并非如此,这导致我在这里发帖。
答案 0 :(得分:0)
该问题似乎是由于某些链接问题引起的。您是否正确使用了链接器标志。对于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
,我可以运行单个测试而不会出现问题。
答案 1 :(得分:0)
我收到以下错误
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