googletest体系结构x86_64的未定义符号错误
googletest Undefined symbols for architecture x86_64 error
让GTEST_DIR
是存储googletest
目录路径的环境变量。(我从谷歌测试的github仓库中克隆了谷歌测试主机。(
我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安装路径。这在$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.a
和libgtest_main.a
。
下一步:在同一个文件夹中,我放了一个主测试源文件main.cpp
,其中包含:
#include "path/to/gtest.h"
int main(int argc, char* argv[])
{
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
和包含的伪测试CCD_ 14
#include "path/to/gtest.h"
TEST(dummy_test, test1)
{
EXPECT_EQ(1,1);
}
和包含的CCD_ 15
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
整个输出都在这个片段中,而nm libgtest.a
的输出则在此片段中。
精度:我在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
,认为它会解决问题,但它没有解决,这导致我在这里发帖。
问题似乎是由一些链接问题引起的。您是否正确使用了链接器标志。对于gtest,我们需要使用-lgtest进行编译,并且链接器可以正确地链接它。同样,我们需要有所有可能的库的标志,我们正在链接。
代码
TEST(dummy_TEST,test1({EXPECT_EQ(1,1(;}
int main(int argc,char**argv({::测试::InitGoogleTest(&argc,argv(;return RUN_ALL_TESTS((;}
使用命令为我完美编译
clang++-std=c++11 main.cpp-lgtest
我可以毫无问题地运行单个测试。
我收到以下错误
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
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++ 中 dlsym 的未定义符号
- 仅在 MacOS 上析构函数的未定义符号
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 生成文件:体系结构x86_64的未定义符号
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- Xcode"体系结构x86_64的未定义符号"
- 体系结构x86_64的未定义符号:找不到原因
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 监视 SDK 下的未定义符号"__Unwind_SjLj_Unregister"
- 使用 Boost/Python 的未定义符号 - 复杂
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自: