我遇到了先有鸡还是先有蛋的情况。我正在使用 vcpkg,这需要我从命令行设置 cmake 工具链文件。但我还有一些cmake_policy
语句需要在工具链文件之前在 CMakeLists.txt 中设置。
以下是 cmake 的调用方式:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-linux ..
Run Code Online (Sandbox Code Playgroud)
但该项目使用了一些包,需要立即执行以下两个策略CMAKE_MINIMUM_REQUIRED
:
CMAKE_POLICY ( SET CMP0003 NEW ) # libs linked via full path
CMAKE_POLICY ( SET CMP0011 NEW ) # push/pop instead of no_policy_scope
Run Code Online (Sandbox Code Playgroud)
我的问题: 有没有办法从内部指定工具链CMakeLists.txt
——大概是在设置两个 cmake 策略之后立即指定——而不是在命令行?
我收到的我想解决的警告是:
CMake Warning (dev) at vcpkg/scripts/buildsystems/vcpkg.cmake:221 (_add_executable):
Policy CMP0003 should be set before this line. Add code such as
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
Run Code Online (Sandbox Code Playgroud) 在 VS2017 中使用 CMake 时,我一直无法弄清楚如何让 CMake 找到并设置正确的 GLFW CMake 常量。任何帮助将不胜感激 :)。
我是glfw3
通过微软的vcpkg
工具下载的。我已经检查过文件确实存在于vcpkg
将它们放入 ( ~\vcpkg\installed\x86-windows\include
)的目录中。我CMakeSettings.json
根据他们的文档在这里设置了我的。我使用该教程作为正确设置 GLFW 的基础。
然后我用它find_package(glfw3 REQUIRED)
来查找glfw3
图书馆。这不会吐出任何错误。实际上CMakeLists.txt
根本没有抱怨。它在编译阶段抱怨。
之后,我将glfw3
with添加target_link_libraries(exe ${GLFW3_LIBRARIES})
到可执行文件中。
然后当我尝试构建一个简单的示例(包括头文件)时,编译失败,因为它找不到GLFW/glfw3.h
.
来自 MSVC 的错误:
fatal error C1083: Cannot open include file: 'GLFW/glfw3.h': No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是我CMakeLists.txt
的补充参考:
cmake_minimum_required(VERSION 3.7)
project(learn-opengl)
find_package(glfw3 REQUIRED)
add_executable(learn-opengl main.cpp)
target_link_libraries(learn-opengl ${GLFW3_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
GLFW3_LIBRARIES
我glfw3Config.cmake
通过窥探vcpkg
安装目录中的内容(~\vcpkg\installed\x86-windows\share\glfw3
) …
我不明白如何通过 vcpkg 安装 python。我的 CMakesLists 文件是:
cmake_minimum_required(VERSION 3.8)
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
set(CMAKE_TOOLCHAIN_FILE "./vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "")
endif()
project(test)
find_package(Python3 COMPONENTS Development REQUIRED)
add_executable(test test.cpp)
target_link_libraries(test PRIVATE Python3::Python)
Run Code Online (Sandbox Code Playgroud)
c++文件直接取自https://docs.python.org/3/extending/embedding.html#very-high-level-embedding
一切编译和链接都没有错误,但在执行时会出现以下错误:
Python path configuration:
PYTHONHOME = (not set)
PYTHONPATH = (not set)
program name = 'C:\Users\smith\OneDrive\Desktop\OSU\vcpkg-python-test\build\Debug\test.exe'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = 'C:\\Users\\smith\\OneDrive\\Desktop\\OSU\\vcpkg-python-test\\build\\Debug\\test.exe'
sys.base_prefix = ''
sys.base_exec_prefix = ''
sys.platlibdir = 'lib'
sys.executable = 'C:\\Users\\smith\\OneDrive\\Desktop\\OSU\\vcpkg-python-test\\build\\Debug\\test.exe'
sys.prefix = ''
sys.exec_prefix = '' …
Run Code Online (Sandbox Code Playgroud) 我有一个使用 vcpkg 来管理其依赖项的 cmake 项目。vcpkg 用于“清单模式”。这意味着我的依赖项是在项目根目录中的 vcpkg.json 中指定的:
{
"name": "myproject",
"version-string": "1.0.0",
"builtin-baseline": "232704deb708fc866905af170b63c1a9cb821dbc",
"dependencies": [
{
"name" : "imgui",
"default-features": true,
"features" : ["docking-experimental"]
},
"magnum",
{
"name" : "magnum-integration",
"default-features": false,
"features" : ["imgui"]
}
]
}
Run Code Online (Sandbox Code Playgroud)
该"builtin-baseline"
字段包含 git SHA-1,标识我自己私人维护的 vcpkg 存储库中的提交。
例如,magnum
依赖项配置为使用最新的“基线”版本。这意味着如果您转到 vcpkg 的安装位置,则会有一个文件 versions/baseline.json,其中确定了基线。
vcpkg 有一个(复杂且不直观的)机制来将某些依赖项固定到旧版本。但是,我找不到如何修改 vcpkg 安装的结构化方法,因此它将从 git 存储库安装不同的版本。vcpkg“覆盖端口”功能在清单模式下不起作用。
理想情况下,vcpkg 允许我做一些简单的事情,例如:
"magnum",
{
"git-commit" : "dagfaghsfdg",
"name" : "magnum-integration",
"default-features": false,
"features" : ["imgui"]
}
Run Code Online (Sandbox Code Playgroud)
那么如何配置 vcpkg 以使用某个依赖项的 git 提交(在清单模式下)?
我正在为一些下载依赖项的项目安装依赖项vcpkg
(该项目是 Hyperledger Iroha,但这并不重要)。不幸的是,当使用我的编译器(g++ 12.1.0)编译依赖项时,其中一个包(abseil)无法编译。
它不编译的原因很容易在代码中修复 - 只需更改一行。
\n该线由cmake
:
CMake Error at scripts/cmake/vcpkg_execute_build_process.cmake:146 (message):\n Command failed: /usr/bin/cmake --build . --config Debug --target install -- -v -j13\n Working Directory: /home/agh/Pulpit/blockchain/internship2022/iroha/vcpkg-build/buildtrees/abseil/x64-linux-dbg\n See logs for more information:\n /home/agh/Pulpit/blockchain/internship2022/iroha/vcpkg-build/buildtrees/abseil/install-x64-linux-dbg-out.log\n
Run Code Online (Sandbox Code Playgroud)\n错误是:
\n/home/agh/Pulpit/blockchain/internship2022/iroha/vcpkg-build/buildtrees/abseil/src/ca9688e9f6-e4cda1d679.clean/absl/debugging/failure_signal_handler.cc:139:32: error: no matching function for call to \xe2\x80\x98max(long int, int)\xe2\x80\x99\n 139 | size_t stack_size = (std::max(SIGSTKSZ, 65536) + page_mask) & ~page_mask;\n | ~~~~~~~~^~~~~~~~~~~~~~~~~\nIn file included from /usr/include/c++/12.1.0/algorithm:60,\n
Run Code Online (Sandbox Code Playgroud)\n原因很容易修复 - 我只需要更改一行即可解决此问题。\n不幸的是,当我更改代码行并重新运行后:
\nvcpkg install abseil\n …
Run Code Online (Sandbox Code Playgroud) 我可以毫无问题地运行和编译,但是 VSCode Intellisense 说它无法打开源文件 boost/asio.hpp (即使它显然可以)并且一直将其标记为错误,我想知道它为什么这样做它以及如何修复它
我有以下目录:
root/
include/
atr_include.hpp
user_interface.hpp
src/
user_interface.cpp
CMakeList.txt
main.cpp
CMakeList.txt
Run Code Online (Sandbox Code Playgroud)
使用 CMakeList.txt:
root/
include/
atr_include.hpp
user_interface.hpp
src/
user_interface.cpp
CMakeList.txt
main.cpp
CMakeList.txt
Run Code Online (Sandbox Code Playgroud)
src / CMakeList:
#CMake minimum version
cmake_minimum_required(VERSION 3.0.0)
#C++ Standard version
set(CMAKE_CXX_STANDARD 20)
### Searches for the VCPKG
if(DEFINED ENV{VCPKG_ROOT})
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
endif()
project(main LANGUAGES CXX VERSION 0.1.0 )
find_package(Boost COMPONENTS system json REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
include_directories(include)
link_directories(src)
add_subdirectory(src)
link_libraries(atr_lib)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
endif()
if(MSVC OR MSYS OR MINGW)
target_link_libraries(${PROJECT_NAME} ws2_32)
endif() …
Run Code Online (Sandbox Code Playgroud) 我以前将 Visual Studio 与 NuGet 一起用于所有包。现在我改为 CMake。
现在我使用vcpkg来管理库。
但是,我需要 OpenGL
Cmake 链接 freeglut、glew、glm、libpng、zlib 的命令由 vcpkg 提供。但不是 OpenGL。
cmake_minimum_required(VERSION 3.0)
project(little_plane)
set(CMAKE_CXX_STANDARD 14)
add_executable(little_plane main.cpp)
# ./vcpkg install freeglut
find_package(GLUT REQUIRED)
target_link_libraries(little_plane PRIVATE GLUT::GLUT)
## ./vcpkg install glew
#find_package(GLEW REQUIRED)
#target_link_libraries(little_plane PRIVATE GLEW::GLEW)
#
# glm
find_package(glm CONFIG REQUIRED)
target_link_libraries(little_plane PRIVATE glm)
# ./vcpkg install libpng
find_package(PNG REQUIRED)
target_link_libraries(little_plane PRIVATE PNG::PNG)
##
find_package(ZLIB REQUIRED)
target_link_libraries(little_plane PRIVATE ZLIB::ZLIB)
find_package(OpenGL REQUIRED)
if (OPENGL_FOUND)
message("opengl found")
message("include dir: ${OPENGL_INCLUDE_DIR}")
message("link libraries: ${OPENGL_gl_LIBRARY}") …
Run Code Online (Sandbox Code Playgroud) 当我时vcpkg install simdjson
,它返回:
The package simdjson:x64-linux provides CMake targets:
find_package(simdjson CONFIG REQUIRED)
target_link_libraries(main PRIVATE simdjson::simdjson simdjson::simdjson-flags simdjson::simdjson-headers)
Run Code Online (Sandbox Code Playgroud)
所以我添加
find_package(simdjson CONFIG REQUIRED)
target_link_libraries(main PRIVATE simdjson::simdjson simdjson::simdjson-flags simdjson::simdjson-headers)
Run Code Online (Sandbox Code Playgroud)
使用CMakeLists.txt
该包simdjson
但当我这样做时vcpkg install redis-plus-plus[cxx17]
,它什么也没返回。我应该怎么做才能cmake
使用这个包?
我是 C++ 新手,需要下载一个包,所以我想我会使用 vcpkg。问题是 vcpkg 比我预期的要慢。这是我的语法:
vcpkg install <PACKAGE>
Run Code Online (Sandbox Code Playgroud)
vcpkg 需要很多时间,这让我想知道是否有一个标志可以加快vcpkg 下载速度。
我开始使用 Apache arrow。我是通过vcpkg安装的。一切都很好,直到我将安装的 arrow 更新到 6.0.1。我使用 powershell 控制台中的以下命令安装了它:
vcpkg install arrow:x64-windows-static
Run Code Online (Sandbox Code Playgroud)
它已成功安装,我看到了成功消息(不知何故):
The package arrow provides CMake targets:
find_package(arrow CONFIG REQUIRED)
target_link_libraries(main PRIVATE re2::re2 arrow_static parquet_static arrow_bundled_dependencies)
Run Code Online (Sandbox Code Playgroud)
我有一个名为csv_column_test.cpp
. 然后我注释掉了该文件的所有内容,除了这两行:
#define ARROW_STATIC
#include <arrow/api.h>
Run Code Online (Sandbox Code Playgroud)
并尝试编译它。我不断遇到这个错误:
error C2668: 'arrow::internal::launder': ambiguous call to overloaded function
Run Code Online (Sandbox Code Playgroud)
我想念什么?如何让事情再次运转?
谢谢。
这是完整的错误日志:
>------ Build All started: Project: StockPredII, Configuration: x64-Debug (default) ------
[1/2] Building CXX object splib\CMakeFiles\splib_test.dir\sparrow\csv_column_test.cpp.obj
FAILED: splib/CMakeFiles/splib_test.dir/sparrow/csv_column_test.cpp.obj
C:\PROGRA~2\MICROS~4\2019\PROFES~1\VC\Tools\MSVC\1429~1.301\bin\Hostx64\x64\cl.exe /nologo /TP -DARROW_DEPENDENCY_SOURCE=VCPKG -D_SILENCE_CXX17_RESULT_OF_DEPRECATION_WARNING -I\Catch2\include -I..\..\..\splib -IE:\sandbox\vcpkg\installed\x64-windows-static\include /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MTd /Zi /Ob0 …
Run Code Online (Sandbox Code Playgroud) vcpkg ×10
c++ ×8
cmake ×7
apache-arrow ×1
boost-asio ×1
dependencies ×1
glfw ×1
opengl ×1
python ×1