在 Mac 上构建 Google 测试时出现链接错误(命令行)

2021-12-28 00:00:00 testing build linker c++ googletest

我目前正在尝试构建一些使用 Google C++ 测试框架的测试代码,但我一直收到一个错误提示

I am currently trying to build some test code that uses Google C++ Test framework but I keep getting an error stating

ld: 警告:在/usr/local/lib/libgtest.dylib 中,文件是为不受支持的文件格式构建的,这不是所链接的体系结构 (i386)

ld: warning: in /usr/local/lib/libgtest.dylib, file was built for unsupported file format which is not the architecture being linked (i386)

我已尝试使问题尽可能简单:

I have tried to make the issue as simple as possible:

我有一个主函数cmtest.cc

I have a main function cmtest.cc

#include <gtest/gtest.h>

/** Main entry point */
int main(int argc, char**argv, char**envArg)
{
    testing::InitGoogleTest(&argc, argv);
    return(RUN_ALL_TESTS());
}

非常基础的测试代码CrazyTest.cc

really basic test code CrazyTest.cc

#include <gtest/gtest.h>
TEST(CrazyTest, one) {
    EXPECT_EQ(2, 2);
}

我使用以下命令来构建 gtest 和我的测试代码.

I use the following commands to build gtest and my test code.

g++ -o CrazyTest.o -c -Wall -Werror=non-virtual-dtor -pipe -std=c++98 -fno-rtti -fno-exceptions -fno-strict-aliasing -Wno-deprecated -g -arch i386 -arch x86_64 -mmacosx-version-min=10.5.4 -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_HAS_RTTI=0 -I/opt/gtest-1.6.0/include CrazyTest.cc

g++ -o cmtest.o -c -Wall -Werror=non-virtual-dtor -pipe -std=c++98 -fno-rtti -fno-exceptions -fno-strict-aliasing -Wno-deprecated -g -arch i386 -arch x86_64 -mmacosx-version-min=10.5.4 -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_HAS_RTTI=0 -I/opt/gtest-1.6.0/include cmtest.cc

g++ -o gtest-all.o -c -Wall -Werror=non-virtual-dtor -pipe -std=c++98 -fno-rtti -fno-exceptions -fno-strict-aliasing -Wno-deprecated -g -arch i386 -arch x86_64 -mmacosx-version-min=10.5.4 -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_HAS_RTTI=0 -I/opt/gtest-1.6.0 -I/opt/gtest-1.6.0/include /opt/gtest-1.6.0/src/gtest-all.cc

ar rc libgtest.a gtest-all.o

ranlib libgtest.a

g++ -o cmtest -arch i386 -arch x86_64 -mmacosx-version-min=10.5.4 CrazyTest.o cmtest.o -lstdc++ -lgtest

最后的构建步骤给了我以下错误,我无法弄清楚原因.我能够进行实际测试(不是所示的简单测试)以在其他操作系统上构建 mac OS(leopard)给我带来的问题.

The final build step gives me the following error and I am unable to figure out why. I am able to get the actual tests (not the simple one shown) to build on other OSs the mac OS (leopard) is giving me problems.

 ld: warning: in /usr/local/lib/libgtest.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
Undefined symbols for architecture i386:
  "testing::Test::~Test()", referenced from:
      CrazyTest_one_Test::~CrazyTest_one_Test()in CrazyTest.o
      CrazyTest_one_Test::~CrazyTest_one_Test()in CrazyTest.o
  "testing::internal::AssertHelper::~AssertHelper()", referenced from:
      CrazyTest_one_Test::TestBody()      in CrazyTest.o
  "testing::Test::Test()", referenced from:
      CrazyTest_one_Test::CrazyTest_one_Test()in CrazyTest.o
  "testing::internal::GetTestTypeId()", referenced from:
      __static_initialization_and_destruction_0(int, int)in CrazyTest.o
  "testing::Test::TearDown()", referenced from:
      vtable for CrazyTest_one_Testin CrazyTest.o
  "testing::internal::EqFailure(char const*, char const*, testing::internal::String const&, testing::internal::String const&, bool)", referenced from:
      testing::AssertionResult testing::internal::CmpHelperEQ<int, int>(char const*, char const*, int const&, int const&)in CrazyTest.o
  "testing::UnitTest::GetInstance()", referenced from:
      _main in cmtest.o
  "testing::internal::IsTrue(bool)", referenced from:
      testing::internal::scoped_ptr<std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > >::reset(std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >*)in CrazyTest.o
      testing::internal::scoped_ptr<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::reset(std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)in CrazyTest.o
  "testing::UnitTest::Run()", referenced from:
      _main in cmtest.o
  "testing::internal::AssertHelper::operator=(testing::Message const&) const", referenced from:
      CrazyTest_one_Test::TestBody()      in CrazyTest.o
  "testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)", referenced from:
      CrazyTest_one_Test::TestBody()      in CrazyTest.o
  "testing::AssertionSuccess()", referenced from:
      testing::AssertionResult testing::internal::CmpHelperEQ<int, int>(char const*, char const*, int const&, int const&)in CrazyTest.o
  "testing::Test::SetUp()", referenced from:
      vtable for CrazyTest_one_Testin CrazyTest.o
  "testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)", referenced from:
      __static_initialization_and_destruction_0(int, int)in CrazyTest.o
  "testing::InitGoogleTest(int*, char**)", referenced from:
      _main in cmtest.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
lipo: can't open input file: /var/tmp//ccZQiF8k.out (No such file or directory)

我已经为我构建的所有东西定义了 -arch i386 和 -arch x86_64,所以我无法弄清楚我错过了什么.我没有在 Mac 上做很多编程,这个特殊问题让我陷入困境.

I have defined -arch i386 and -arch x86_64 for everything I have built so I am unable to figure out what I have missed. I don't do a lot of programming on Macs and this particular issue has me stuck.

任何建议都会有所帮助.

Any suggestions would be helpful.

推荐答案

已找到解决方案.事实证明,所使用的构建指令是正确的,问题是在正在执行构建的计算机上,另一位开发人员使用 Google 测试框架 1.5 完成了一些工作,并且他们在编译器搜索路径中的计算机上安装了库.这导致编译器首先找到未使用多个架构选项编译的另一个库.

Solution found. It turns out that the build instructions used are correct the issue was that on the computer that the build was being performed another developer had done some work with Google Test Framework 1.5 and they had installed the libraries on the computer in the compilers search path. This resulted in the compiler finding the other library first that was not compiled using multiple architecture options.

相关文章