相关文章推荐
豪气的眼镜  ·  gtest c++ exception ...·  1 年前    · 
瘦瘦的熊猫  ·  如何在Windows ...·  1 年前    · 
英俊的遥控器  ·  PostgreSQL Update ...·  1 年前    · 

如何在Windows x64上使用cmake安装cpp库?

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 提问于2022-08-20

我在Windowsx64平台上与MinGW一起使用CLion -这是问题的背景。

我之前试着安装gtest。但中间出现了许多混乱。

我第一次按照 googletest-release-1.12.1\ 的指令运行这些命令(在 googletest-release-1.12.1\googletest\README.md 中)

mkdir build
cd build
cmake ..

但我收到了这样的错误信息:

CMake Error at CMakeLists.txt:51 (project):
  Failed to run MSBuild command:
    C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe
  to get the value of VCTargetsPath:

然后我把我最后的命令改为

cmake -G "MinGW Makefiles" ..

因为我使用MinGW提供的make。我不知道它是否正确,但它运行正常。

然后我打电话给

make
make install

make 跑得很顺利。但是当我运行 make install 时,我得到了这些消息

Install the project...
-- Install configuration: ""
-- Installing: C:/Program Files (x86)/googletest-distribution/include
CMake Error at googlemock/cmake_install.cmake:41 (file):
  file INSTALL cannot make directory "C:/Program Files
  (x86)/googletest-distribution/include": No such file or directory.
Call Stack (most recent call first):
  cmake_install.cmake:42 (include)
make: *** [Makefile:109: install] Error 1

这段时间我都不知道。所以我改变了我的方式。根据 this 的回答,我将整个库复制到我的项目中,并按如下方式编辑 CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(gtest_study)
set(CMAKE_CXX_STANDARD 20)
add_subdirectory(googletest-release-1.12.1)
include_directories(googletest-release-1.12.1/googletest/include)
include_directories(googletest-release-1.12.1/googlemock/include)
add_executable(gtest_study main.cpp)
target_link_libraries(gtest_study gtest gtest_main)
target_link_libraries(gtest_study gmock gmock_main)

所以我的问题是:

  1. :使用 make cmake 构建它的两种方法有什么区别吗?只使用 CMakeLists.txt 中的 include_directories target_link_libraries 之类的命令?(比如 .h .dll 文件?)还是完全一样?我不知道)
  2. 当我使用 make install 上安装一个库时,我应该做什么,特别是 ?在我的系统环境中指定某个目录(我不知道是哪个目录)或what?
  3. Although,在我的系统环境中使用makefile,在最终使用库的CLion中,我使用忍者作为CMake的生成器(它只是附带CLion,不是为系统安装的)。我必须指定它吗?( -G "Ninja" 在我的本地env中不工作)
浏览 18 关注 0 得票数 0
  • 得票数为Stack Overflow原文数据
原文
回答于2022-08-20
得票数 1

之间的区别

cmake ..

cmake -G "MinGW Makefiles" ..

是生成器的选择:前者使用默认生成器,后者使用您指定的生成器。( cmake --help 应该在默认生成器旁边放置一个 * 。)

根据错误消息,我假设这是一个visual生成器,您可能无法在MinGW终端中正确地运行该生成器。

在后一种情况下,默认安装目录似乎是基于目标OS (Windows)的,但似乎没有考虑到这样一个事实:您是从MinGW终端运行的,默认安装路径( C:/Program Files (x86)/googletest-distribution )无效。

您可以尝试通过在cmake配置期间(在源dir之前传递 -D 'CMAKE_INSTALL_PREFIX=/c/Program Files (x86)/googletest-distribution' )或在安装过程中提供安装目录来修复这个问题。

下面的过程应该允许您安装库。我在这里使用我喜欢的构建方式,即不使用build系统依赖的命令,而是使用cmake运行构建/安装命令。我假设工作目录是gtest源的根目录:

cmake -G "MinGW Makefiles" -S . -B build
cmake --build build
cmake --install build --prefix '/c/Program Files (x86)/googletest-distribution'

最后一个命令需要以管理权限运行,我不建议以admin的形式运行前两个命令。您可以将其安装到一个目录中,在该目录中,即使没有管理权限,也可以创建目录。

使用上面描述的过程和使用 add_subdirectory 之间的区别是,前者导致了系统上的安装,可以通过 find_package 使用,而谷歌测试库不会为您这样做的每个项目重新构建。

...
project(gtest_study)
# you may need to pass the install location via -D CMAKE_PREFIX_PATH=<install_location> during configuration for this to work
find_package(GTest REQUIRED)