vcpkg 不适用于 google 测试
vcpkg does not work for google test
我安装并集成了最新版本的 vcpkg:
e:\work\vcpkg>vcpkg version
Vcpkg package management program version 0.0.65-692a363701156f1bc319306fbde93fb6748325f6
See LICENSE.txt for license information.
e:\work\vcpkg>vcpkg integrate install
Applied user-wide integration for this vcpkg root.
All C++ projects can now #include any installed libraries.
Linking will be handled automatically.
Installing new libraries will make them instantly available.
我安装了google测试:
e:\work\vcpkg>vcpkg list
gtest:x64-windows 1.8 GoogleTest and GoogleMock testing frameworks.
gtest:x86-windows 1.8 GoogleTest and GoogleMock testing frameworks.
我在 Visual Studio 2015 更新 3 的项目中包含了 gtest.h
:
#include <gtest/gtest.h>
它编译正常,但我有 linker 错误:
1>main.obj : error LNK2001: unresolved external symbol "void __cdecl testing::InitGoogleTest(int *,char * *)" (?InitGoogleTest@testing@@YAXPEAHPEAPEAD@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: int __cdecl testing::UnitTest::Run(void)" (?Run@UnitTest@testing@@QEAAHXZ)
1>main.obj : error LNK2001: unresolved external symbol "public: static class testing::UnitTest * __cdecl testing::UnitTest::GetInstance(void)" (?GetInstance@UnitTest@testing@@SAPEAV12@XZ)
显然,Visual Studio 不知道它应该 link 和 gtest.lib
。我不明白为什么。 Vcpkg 只说 "Linking will be handled automatically." 不知道它是怎么做到的。
在我项目的 "Additional Library Dependencies" 中,我可以看到这些继承值:
$(VcpkgRoot)lib
$(VcpkgRoot)lib\manual-link
而$(VcpkgRoot)
解析为e:\work\vcpkg\installed\x64-windows\
。所以看起来整合是成功的。但是 Visual Studio 怎么知道它应该 link 和 gtest.lib
?
请注意,如果我手动将 gtest.lib
添加到 "Additional Dependencies",一切正常,并且 gtest.dll
会自动复制到输出目录。
我认为 gtest
的自动链接行为已被有意禁用,请参阅 vcpkg issue #306。
该问题的原始评论:here.
vcpkg 实现需要手动链接,因为 Google Test 可以重新定义 main()
,并且 gtest 功能在所有四个单独的库文件中都是重复的。
Official documentation.
每个项目配置所需:
在:Configuration Properties
> Linker
> Input
> Additional Dependencies
对于发布版本:
$(VcpkgRoot)lib\manual-link\gtest_main.lib
对于调试版本:
$(VcpkgRoot)debug\lib\manual-link\gtest_main.lib
如果您想创建自己的自定义 main(),请将 gtest_main.lib
替换为 gtest.lib
。
如果要使用gmock,可以替换成gmock_main.lib
或gmock.lib
.
这是一个旧线程,但我想指出我发现的内容。
您需要 link manual-link 目录中的库,但您需要 link 它们的顺序正确。
首先 link gmock_main 然后 gtest_main。
反过来只会导致 0 次测试。
我安装并集成了最新版本的 vcpkg:
e:\work\vcpkg>vcpkg version
Vcpkg package management program version 0.0.65-692a363701156f1bc319306fbde93fb6748325f6
See LICENSE.txt for license information.
e:\work\vcpkg>vcpkg integrate install
Applied user-wide integration for this vcpkg root.
All C++ projects can now #include any installed libraries.
Linking will be handled automatically.
Installing new libraries will make them instantly available.
我安装了google测试:
e:\work\vcpkg>vcpkg list
gtest:x64-windows 1.8 GoogleTest and GoogleMock testing frameworks.
gtest:x86-windows 1.8 GoogleTest and GoogleMock testing frameworks.
我在 Visual Studio 2015 更新 3 的项目中包含了 gtest.h
:
#include <gtest/gtest.h>
它编译正常,但我有 linker 错误:
1>main.obj : error LNK2001: unresolved external symbol "void __cdecl testing::InitGoogleTest(int *,char * *)" (?InitGoogleTest@testing@@YAXPEAHPEAPEAD@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: int __cdecl testing::UnitTest::Run(void)" (?Run@UnitTest@testing@@QEAAHXZ)
1>main.obj : error LNK2001: unresolved external symbol "public: static class testing::UnitTest * __cdecl testing::UnitTest::GetInstance(void)" (?GetInstance@UnitTest@testing@@SAPEAV12@XZ)
显然,Visual Studio 不知道它应该 link 和 gtest.lib
。我不明白为什么。 Vcpkg 只说 "Linking will be handled automatically." 不知道它是怎么做到的。
在我项目的 "Additional Library Dependencies" 中,我可以看到这些继承值:
$(VcpkgRoot)lib
$(VcpkgRoot)lib\manual-link
而$(VcpkgRoot)
解析为e:\work\vcpkg\installed\x64-windows\
。所以看起来整合是成功的。但是 Visual Studio 怎么知道它应该 link 和 gtest.lib
?
请注意,如果我手动将 gtest.lib
添加到 "Additional Dependencies",一切正常,并且 gtest.dll
会自动复制到输出目录。
我认为 gtest
的自动链接行为已被有意禁用,请参阅 vcpkg issue #306。
该问题的原始评论:here.
vcpkg 实现需要手动链接,因为 Google Test 可以重新定义 main()
,并且 gtest 功能在所有四个单独的库文件中都是重复的。
Official documentation.
每个项目配置所需:
在:Configuration Properties
> Linker
> Input
> Additional Dependencies
对于发布版本:
$(VcpkgRoot)lib\manual-link\gtest_main.lib
对于调试版本:
$(VcpkgRoot)debug\lib\manual-link\gtest_main.lib
如果您想创建自己的自定义 main(),请将 gtest_main.lib
替换为 gtest.lib
。
如果要使用gmock,可以替换成gmock_main.lib
或gmock.lib
.
这是一个旧线程,但我想指出我发现的内容。
您需要 link manual-link 目录中的库,但您需要 link 它们的顺序正确。 首先 link gmock_main 然后 gtest_main。 反过来只会导致 0 次测试。