gpt4 book ai didi

c++ - googletest架构x86_64错误的 undefined symbol

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:04 26 4
gpt4 key购买 nike

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 安装路径。这在 $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,以为这样就可以解决问题,但是没有,所以才来这里发帖。

最佳答案

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

代码

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

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

用命令为我完美编译

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

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

关于c++ - googletest架构x86_64错误的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38802547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com