我用一个模拟类创建了一个简单的 C++ 测试项目:
#include <gtest/gtest.h>
#include <gmock/gmock.h>
class TestMock
{
public:
MOCK_CONST_METHOD0(Method1, void());
};
TEST(Test, Test1)
{
TestMock mock;
}
int main(int argc, char * argv[])
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)
我使用 Visual Studio 2017 (15.3.3)。这是一个带有所有默认设置的 x86 调试项目。
我已将 gtest.lib 和 gmock.lib 添加到链接器。当我编译和链接时,我收到此错误:
1>------ Build started: Project: ConsoleApplication1, Configuration: Debug Win32 ------
1>ConsoleApplication1.obj : error LNK2001: unresolved external symbol "class testing::internal::Mutex testing::internal::g_linked_ptr_mutex" (?g_linked_ptr_mutex@internal@testing@@3VMutex@12@A)
1>ConsoleApplication1.obj : error LNK2001: unresolved external symbol "class testing::internal::Mutex testing::internal::g_gmock_mutex" (?g_gmock_mutex@internal@testing@@3VMutex@12@A)
1>d:\Develop\CPP\ConsoleApplication1\Debug\ConsoleApplication1.exe : fatal error LNK1120: …
Run Code Online (Sandbox Code Playgroud) 例如,我使用 VCPKG 构建第三方库,例如 libcurl。我有动态和静态构建。显然,import .lib 和 object .lib 文件分别包含在两个不同的文件夹中,x64-windows 和 x64-windows-static。我想将对象 libcurl.lib 与我的程序静态链接,但无法弄清楚如何配置 Visual Studio 来做到这一点。它总是最终使用导入库,而不是对象库,因此我的程序最终在执行时需要 libcurl.dll。
我已将主项目配置为使用 /MT 运行时库。我尝试将链接器配置为使用指向静态 lib 文件夹和其他依赖项的附加库文件夹。我什至尝试在链接器附加依赖项中使用对象 libcurl.lib 文件的完整路径。
当我使用 /MT 切换运行时库时,我可以通过使用 Dependency Walker 判断所有常规库(如 vcruntime)都集成在可执行文件中,而不是作为 DLL 加载,但 libucurl.dll 仍然存在,动态加载。
似乎由于 VCPKG 自动包含路径集成,Visual Studio 总是首先找到并使用导入 libcurl.lib,即使我在链接器输入中指定了对象 libcurl.lib 的完整路径。
如何配置 Visual Studio 以静态链接正确的 .lib 文件?
我的问题是,如何将 Linux 中的 vcpkg 与交叉构建工具链以及 sysroot 集成?例子:
fedora30
x86_64-centos7-gnu
来自https://github.com/microsoft/vcpkg快速入门 说:
> git clone https://github.com/Microsoft/vcpkg.git
> cd vcpkg
PS> .\bootstrap-vcpkg.bat
Linux:~/$ ./bootstrap-vcpkg.sh
Run Code Online (Sandbox Code Playgroud)
在我的机器上,我安装了 gcc 9.1,它被vcpkg
bootstrap.sh 检测到并且工作正常;
同时,我构建了一个用于交叉构建的工具链,它位于$HOME/cross/x64_86-centos7-linux-gnu/
如何设置另一个vcpkg
使用特定工具链的目录树?
通过“使用”,我的意思是 vcpkg 及其所有包都应该由该工具链编译,并且使用 vcpkg 的 toolchain_file '$vcpkg_home/scripts/buildsystems/vcpkg.cmake' 的项目都应该将该工具链作为 $CC 和构建工具集?
我喜欢 vcpkg 的想法,但我想我更愿意坚持使用 MinGW 作为我的编译器。
我找不到任何关于是否可以设置(或如何设置)vcpkg 以便它为 MinGW 而不是 MSVC 编译包的资源。如果可能的话,有人能给我指出正确的方向吗?
有一些关于此的主题,但它们没有明确的说明,而且我仍在学习这些东西。
谢谢!
我已经安装了 vcpkg,一个 C++ 包管理器。现在过了一段时间,我想更新一下。我怎样才能做到这一点?我需要卸载并重新安装吗?
我使用时有什么区别
vcpkg install <any package>:x64-windows
x64-windows-static
x64-windows-static-md
?假设我已经安装了一些库vcpkg
并且它有很多依赖(比如cgal
)。现在我想用CMake
.
我应该如何知道CMake
我下载的所有库的所有位置?包括我安装的主库?我在 中只有一个设置CMake
,称为“源目录”,它将指向我的代码。图书馆的设置在哪里?
D:\Users\ThirdPartyDesign\CGAL-5.0-examples\CGAL-5.0\examples\Triangulation_2
? env | grep CMAKE
CMAKE_TOOLCHAIN_FILE=D:\Users\ThirdPartyDesign\vcpkg\scripts\buildsystems\vcpkg.cmake
D:\Users\ThirdPartyDesign\CGAL-5.0-examples\CGAL-5.0\examples\Triangulation_2
? cmake .
CMake Warning at CMakeLists.txt:18 (find_package):
By not providing "FindCGAL.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "CGAL", but
CMake did not find one.
Could not find a package configuration file provided by "CGAL" with any of
the following names:
CGALConfig.cmake
cgal-config.cmake
Add the installation prefix of "CGAL" to …
Run Code Online (Sandbox Code Playgroud) 我有一个使用 2 个不同包的项目,pkgA 带有 Triplet x86-windows-static
,pkgB 带有 Triplet x86-windows
。
当我尝试编译我的项目时,pkgA 一切正常,因为$(VcpkgRoot)
是%userprofile%/vcpkg/installed/x86-windows-static
,但是,无法找到 pkgB 的标头,因为它们位于%userprofile%/vcpkg/installed/x86-windows
.
我该如何解决这个问题?
据我所知,这与现有问题并不重复。这个问题专门涉及 Visual Studio 的自动链接 SDL2 库。
我已经使用vcpkgx64-windows
安装了 SDL2 (变体):
vcpkg install sdl2 --triplet x64-windows
Run Code Online (Sandbox Code Playgroud)
我已经为 Visual Studio 提供了 vpkg 库:
vcpkg integrate install
Run Code Online (Sandbox Code Playgroud)
我的 VS 2019 项目配置为使用该Console
子系统,我的主程序如下所示:
vcpkg install sdl2 --triplet x64-windows
Run Code Online (Sandbox Code Playgroud)
为什么我需要指定SDL_MAIN_HANDLED
?似乎由于SDLmain2.lib
某种原因没有发生自动链接?
如果我不指定SDL_MAIN_HANDLED
,链接将失败:
vcpkg integrate install
Run Code Online (Sandbox Code Playgroud)
我也尝试过添加extern "C"
声明main()
但无济于事。
我已经用 SDL2 编写了很多应用程序,但这是我第一次使用 vcpkg 来定位它。
我使用 vcpkg 作为我的 Visual C++ 项目的库管理器。有时我动态链接库并vcpkg
在文件夹中提供 dll \vcpkg\installed\x64-windows\bin
。当我在Debug
或Release
模式下运行项目时,出现与缺少 DLL 相关的错误。组织 Visual C++ 从vcpkg
文件夹中获取 dll 的优雅方法是什么?