首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Windows x64上使用cmake安装cpp库?

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

Stack Overflow用户
提问于 2022-08-20 00:06:37
回答 1查看 109关注 0票数 0

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

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

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

代码语言:javascript
复制
mkdir build
cd build
cmake ..

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

代码语言:javascript
复制
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:

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

代码语言:javascript
复制
cmake -G "MinGW Makefiles" ..

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

然后我打电话给

代码语言:javascript
复制
make
make install

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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. :使用makecmake构建它的两种方法有什么区别吗?只使用CMakeLists.txt中的include_directoriestarget_link_libraries之类的命令?(比如.h.dll文件?)还是完全一样?我不知道)
  2. 当我使用make install上安装一个库时,我应该做什么,特别是?在我的系统环境中指定某个目录(我不知道是哪个目录)或what?
  3. Although,在我的系统环境中使用makefile,在最终使用库的CLion中,我使用忍者作为CMake的生成器(它只是附带CLion,不是为系统安装的)。我必须指定它吗?(-G "Ninja"在我的本地env中不工作)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-20 08:19:05

之间的区别

代码语言:javascript
复制
cmake ..

代码语言:javascript
复制
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源的根目录:

代码语言:javascript
复制
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使用,而谷歌测试库不会为您这样做的每个项目重新构建。

代码语言:javascript
复制
...
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)

target_link_libraries(gtest_study PRIVATE GTest::gtest_main GTest::gmock)

后者将google测试项目构建为您自己的项目构建的一部分,并且对于您使用这种方法的每个项目,都会构建一个单独版本的google测试库。注意:不应该自己指定包含dirs,因为这类信息被附加到cmake目标并自动应用于链接目标:

代码语言:javascript
复制
#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 PRIVATE gtest_main gmock)

3.用于构建CMake的GTest生成器应独立于使用它的项目的生成器。重要的是构建系统所使用的编译器是兼容的。我不能详细说明这一点,因为我从未使用过CLion,因此对它使用的编译器了解太少。(就我个人而言,我正在Windows上使用Visual。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73423280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档