缺少符号——但符号存在?
Missing symbols – but symbols exist?
我正在尝试使用 googletest 编译单元测试目标。虽然它在一个项目中有效,但在另一个项目中却无法 link,我很难理解为什么。
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*)
我不知道从这里到哪里去!
我打赌这是静态库的顺序!
但是现在您已经确定了缺少函数的文件,您可以开始尝试一下直到它起作用。一旦修复,你就会很清楚为什么它必须按那个顺序,你会想知道为什么你的编译器不聪明。你可以在 Whosebug 上找到很多解释,因为我们很多人之前都遇到过这个问题:)
我目前无法尝试,但我相信这是一个有希望的猜测:
/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
事实证明我正在使用的另一个项目中嵌入了一个旧的 gtest header,它被取而代之。
我正在尝试使用 googletest 编译单元测试目标。虽然它在一个项目中有效,但在另一个项目中却无法 link,我很难理解为什么。
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*)
我不知道从这里到哪里去!
我打赌这是静态库的顺序!
但是现在您已经确定了缺少函数的文件,您可以开始尝试一下直到它起作用。一旦修复,你就会很清楚为什么它必须按那个顺序,你会想知道为什么你的编译器不聪明。你可以在 Whosebug 上找到很多解释,因为我们很多人之前都遇到过这个问题:)
我目前无法尝试,但我相信这是一个有希望的猜测:
/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
事实证明我正在使用的另一个项目中嵌入了一个旧的 gtest header,它被取而代之。