使用 Boost 作为 CMake 的 git 子模块
Use Boost as a git submodule with CMake
我想为我的 C++ 项目使用 Boost 库(更准确地说,我对 Boost Graph Library 感兴趣)。我希望它在我的 git 存储库中,作为一个 git 子模块,就像对所有其他依赖项所做的那样。
例如,如果我想启动一个具有 fmt
依赖项作为 git 子模块的项目,我会这样做:
mkdir my_project
cd my_project
git init .
然后,我想在标签 8.0.0
:
上添加 fmt
作为子模块
mkdir deps
git submodule add https://github.com/fmtlib/fmt.git deps/fmt
cd deps/fmt
git checkout 8.0.0
然后,我回到项目的根文件夹:
cd ../..
然后我创建了以下文件:
main.cpp
#include <fmt/format.h>
int main() {
fmt::print("Hello, World!\n");
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.17)
project(test_boost)
add_subdirectory(deps/fmt)
add_executable(test_boost main.cpp)
target_link_libraries(test_boost fmt::fmt)
然后,我们可以构建:
mkdir build
cd build
cmake ..
make
二进制文件工作正常,预计会打印 Hello, World!
,这很好。
现在如果我想添加提升,版本 1.77.0
:
git submodule add https://github.com/boostorg/boost deps/boost
git submodule update --init --recursive # To get Boost's own submodules.
cd deps/boost
git checkout boost-1.77.0
cd ../..
现在我想使用这个 boost 文件夹作为我项目的依赖项,这就是它变得棘手的地方。我读 从版本 1.77
开始,我应该可以使用 find_package()
来做到这一点,因为它取代了 FindBoost
的东西:
find_package(Boost 1.77.0 REQUIRED CONFIG PATHS deps/boost/tools/boost_install)
但我收到以下错误:
-- Module support is disabled.
-- Version: 8.0.1
-- Build type: Debug
-- CXX_STANDARD: 11
-- Required features: cxx_variadic_templates
CMake Error at CMakeLists.txt:6 (find_package):
Could not find a configuration file for package "Boost" that is compatible
with requested version "1.77.0".
The following configuration files were considered but not accepted:
/home/me/tests/boost_so/my_project/deps/boost/tools/boost_install/BoostConfig.cmake, version: unknown
-- Configuring incomplete, errors occurred!
See also "/home/me/tests/boost_so/my_project/cmake-build-debug/CMakeFiles/CMakeOutput.log".
See also "/home/me/tests/boost_so/my_project/cmake-build-debug/CMakeFiles/CMakeError.log".
我也尝试了其他方法,但 运行 出现以下错误之一:
- 同上
- CMake 使用我从
/usr/local
安装的 Boost,这不是我想要的。
我正在使用 CMake 3.17.2
。可以这样做还是我遗漏了什么?
那个 也列出了您需要使用的 Cmake 版本。为了能够使用 FindBoost
,您需要 cmake 版本 3.21.3
或更高版本,但您使用的是 3.17.2
我找到了一个看起来很简单的解决方案。您可以 add_subdirectory()
如 fmt
所示。
完整的 CMakeLists.txt
文件如下所示:
cmake_minimum_required(VERSION 3.17)
project(test_boost)
add_subdirectory(deps/fmt)
add_subdirectory(deps/boost EXCLUDE_FROM_ALL)
add_executable(test_boost main.cpp)
target_link_libraries(test_boost fmt::fmt Boost::graph)
然后,可以看到the following编译运行正常:
#include <fmt/format.h>
#include <boost/graph/adjacency_list.hpp>
#include <array>
#include <utility>
#include <iostream>
int main() {
fmt::print("Hello, World!\n");
enum { topLeft, topRight, bottomRight, bottomLeft };
std::array<std::pair<int, int>, 4> edges{{
std::make_pair(topLeft, topRight),
std::make_pair(topRight, bottomRight),
std::make_pair(bottomRight, bottomLeft),
std::make_pair(bottomLeft, topLeft)
}};
typedef boost::adjacency_list<boost::setS, boost::vecS,
boost::undirectedS> graph;
graph g{edges.begin(), edges.end(), 4};
std::cout << boost::num_vertices(g) << '\n';
std::cout << boost::num_edges(g) << '\n';
g.clear();
return 0;
}
输出
Hello, World!
4
4
我想为我的 C++ 项目使用 Boost 库(更准确地说,我对 Boost Graph Library 感兴趣)。我希望它在我的 git 存储库中,作为一个 git 子模块,就像对所有其他依赖项所做的那样。
例如,如果我想启动一个具有 fmt
依赖项作为 git 子模块的项目,我会这样做:
mkdir my_project
cd my_project
git init .
然后,我想在标签 8.0.0
:
fmt
作为子模块
mkdir deps
git submodule add https://github.com/fmtlib/fmt.git deps/fmt
cd deps/fmt
git checkout 8.0.0
然后,我回到项目的根文件夹:
cd ../..
然后我创建了以下文件:
main.cpp
#include <fmt/format.h>
int main() {
fmt::print("Hello, World!\n");
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.17)
project(test_boost)
add_subdirectory(deps/fmt)
add_executable(test_boost main.cpp)
target_link_libraries(test_boost fmt::fmt)
然后,我们可以构建:
mkdir build
cd build
cmake ..
make
二进制文件工作正常,预计会打印 Hello, World!
,这很好。
现在如果我想添加提升,版本 1.77.0
:
git submodule add https://github.com/boostorg/boost deps/boost
git submodule update --init --recursive # To get Boost's own submodules.
cd deps/boost
git checkout boost-1.77.0
cd ../..
现在我想使用这个 boost 文件夹作为我项目的依赖项,这就是它变得棘手的地方。我读 1.77
开始,我应该可以使用 find_package()
来做到这一点,因为它取代了 FindBoost
的东西:
find_package(Boost 1.77.0 REQUIRED CONFIG PATHS deps/boost/tools/boost_install)
但我收到以下错误:
-- Module support is disabled.
-- Version: 8.0.1
-- Build type: Debug
-- CXX_STANDARD: 11
-- Required features: cxx_variadic_templates
CMake Error at CMakeLists.txt:6 (find_package):
Could not find a configuration file for package "Boost" that is compatible
with requested version "1.77.0".
The following configuration files were considered but not accepted:
/home/me/tests/boost_so/my_project/deps/boost/tools/boost_install/BoostConfig.cmake, version: unknown
-- Configuring incomplete, errors occurred!
See also "/home/me/tests/boost_so/my_project/cmake-build-debug/CMakeFiles/CMakeOutput.log".
See also "/home/me/tests/boost_so/my_project/cmake-build-debug/CMakeFiles/CMakeError.log".
我也尝试了其他方法,但 运行 出现以下错误之一:
- 同上
- CMake 使用我从
/usr/local
安装的 Boost,这不是我想要的。
我正在使用 CMake 3.17.2
。可以这样做还是我遗漏了什么?
那个 FindBoost
,您需要 cmake 版本 3.21.3
或更高版本,但您使用的是 3.17.2
我找到了一个看起来很简单的解决方案。您可以 add_subdirectory()
如 fmt
所示。
完整的 CMakeLists.txt
文件如下所示:
cmake_minimum_required(VERSION 3.17)
project(test_boost)
add_subdirectory(deps/fmt)
add_subdirectory(deps/boost EXCLUDE_FROM_ALL)
add_executable(test_boost main.cpp)
target_link_libraries(test_boost fmt::fmt Boost::graph)
然后,可以看到the following编译运行正常:
#include <fmt/format.h>
#include <boost/graph/adjacency_list.hpp>
#include <array>
#include <utility>
#include <iostream>
int main() {
fmt::print("Hello, World!\n");
enum { topLeft, topRight, bottomRight, bottomLeft };
std::array<std::pair<int, int>, 4> edges{{
std::make_pair(topLeft, topRight),
std::make_pair(topRight, bottomRight),
std::make_pair(bottomRight, bottomLeft),
std::make_pair(bottomLeft, topLeft)
}};
typedef boost::adjacency_list<boost::setS, boost::vecS,
boost::undirectedS> graph;
graph g{edges.begin(), edges.end(), 4};
std::cout << boost::num_vertices(g) << '\n';
std::cout << boost::num_edges(g) << '\n';
g.clear();
return 0;
}
输出
Hello, World!
4
4