缺少符号-但是符号存在吗?

时间:2019-06-18 20:51:48

标签: c++ cmake googletest

我正在尝试使用googletest编译单元测试目标。当它在一个项目中运行时,它无法链接到另一个项目中,而我正努力了解原因。

CMake生成的link.txt

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -stdlib=libc++ -std=gnu++11 -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/runTests.dir/ATAppTests.cpp.o  -o runTests ../../src/targetLib.a ../../lib/libgtestd.a ../../lib/libgtest_maind.a ../../lib/libgmockd.a ../../lib/libgmock_maind.a ../../lib/libgmockd.a ../../lib/libgtestd.a 

运行该命令的结果:

Undefined symbols for architecture x86_64:
  "testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)", referenced from:
      ___cxx_global_var_init in ATAppTests.cpp.o

但是,运行nm表示该符号在那里:

 $ nm --demangle ../../lib/libgtestd.a | grep 'MakeAndRegister'
000000000000ebe0 T testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, testing::internal::CodeLocation, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)

我不确定从这里去哪里!

2 个答案:

答案 0 :(得分:1)

事实证明,我正在使用的另一个项目中嵌入了一个旧的gtest标头,而该标头已被替换。

https://github.com/meekrosoft/fff/blob/master/gtest/gtest.h

答案 1 :(得分:0)

我敢打赌,那里有静态库的顺序!

但是,既然您已经确定了缺少功能的文件,则可以开始播放直到它起作用。修复后,它对于您将变得非常明显,为什么它必须按此顺序排列,您会怀疑为什么您的编译器不那么聪明。您可以在此处找到有关stackoverflow的许多解释,因为我们很多人以前都曾遇到过这个问题:)

我目前无法尝试,但这-我相信-是一个很有前途的猜测:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -stdlib=libc++ -std=gnu++11 -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/runTests.dir/ATAppTests.cpp.o -o runTests ../../src/targetLib.a ../../lib/libgtestd.a ../../lib/libgtestd.a ../../lib/libgtest_maind.a ../../lib/libgmockd.a ../../lib/libgmock_maind.a ../../lib/libgmockd.a