如何允许编译器查找通过 brew 安装的库



我正在macOS Catalina上工作,我想使用CMake编译一些c ++代码。

这段代码需要我通过 Brew (brew install boost( 安装的库提升。在我的代码中,我添加了使用它#include <boost/functional/hash.hpp>

编译时出现以下错误:

fatal error: boost/functional/hash.hpp: No such file or directory #include <boost/functional/hash.hpp>

显然,编译器找不到库,所以我的问题是:我怎么能告诉他库在哪里?我更喜欢设置一些环境变量,如果不可能,如何使用 CMake 做到这一点?

调用 boost 的文件:

#include "../../include/util/SubsetInt.hpp"
#include <boost/functional/hash.hpp>
namespace cats {
SubsetInt::SubsetInt(const SubsetInt& p) {
field = std::vector<uint64_t>();
for (uint64_t e : p.field) {
field.push_back(e);
}
}
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)
project(catsFramework)

find_package(Boost REQUIRED COMPONENTS system unit_test_framework)
find_package(OpenMP REQUIRED)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS} -O3 -DNDEBUG -Wall")
# set(CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS} -O1 -g -Wall")

################### COMBINATOR LIBS ##########################
add_library(LDSCombinator STATIC
include/combinators/LDSCombinator.hpp
src/combinators/LDSCombinator.cpp
)
add_library(PrefixEquivalenceCombinator STATIC
include/combinators/PrefixEquivalenceCombinator.hpp
src/combinators/PrefixEquivalenceCombinator.cpp
)
add_library(IterativeBroadeningCombinator STATIC
include/combinators/IterativeBroadeningCombinator.hpp
src/combinators/IterativeBroadeningCombinator.cpp
)
add_library(ProbingCombinator STATIC
include/combinators/ProbingCombinator.hpp
src/combinators/ProbingCombinator.cpp
)
add_library(SolutionPartsCombinator STATIC
include/combinators/SolutionPartsCombinator.hpp
src/combinators/SolutionPartsCombinator.cpp
)
add_library(WeightedCombinator STATIC
include/combinators/WeightedCombinator.hpp
src/combinators/WeightedCombinator.cpp
)
# all combinators defintion
set( COMBINATORS
LDSCombinator
IterativeBroadeningCombinator
PrefixEquivalenceCombinator
ProbingCombinator
SolutionPartsCombinator
WeightedCombinator
)

############## TREE SEARCH ALGORITHMS #################

add_library(DFS STATIC
include/treesearch/DFS.hpp
src/treesearch/DFS.cpp
)
add_library(BFS STATIC
include/treesearch/BFS.hpp
src/treesearch/BFS.cpp
)
add_library(AStar STATIC
include/treesearch/AStar.hpp
src/treesearch/AStar.cpp
)
add_library(MBAStar STATIC
include/treesearch/MBAStar.hpp
src/treesearch/MBAStar.cpp
)
add_library(BeamSearch STATIC
include/treesearch/BeamSearch.hpp
src/treesearch/BeamSearch.cpp
)
add_library(GreedyRandom STATIC
include/treesearch/GreedyRandom.hpp
src/treesearch/GreedyRandom.cpp
)
add_library(WeightedAStar STATIC
include/treesearch/WeightedAStar.hpp
src/treesearch/WeightedAStar.cpp
)
add_library(Greedy STATIC
include/treesearch/Greedy.hpp
src/treesearch/Greedy.cpp
)
add_library(IterativeMBAStar STATIC
include/treesearch/IterativeMBAStar.hpp
src/treesearch/IterativeMBAStar.cpp
)
add_library(IterativeBeamSearch STATIC
include/treesearch/IterativeBeamSearch.hpp
src/treesearch/IterativeBeamSearch.cpp
)
add_library(LDS STATIC
include/treesearch/LDS.hpp
src/treesearch/LDS.cpp
)
add_library(BULB STATIC
include/treesearch/BULB.hpp
src/treesearch/BULB.cpp
)
add_library(IterativeBroadening STATIC
include/treesearch/IterativeBroadening.hpp
src/treesearch/IterativeBroadening.cpp
)
add_library(BranchAndGreed STATIC
include/treesearch/BranchAndGreed.hpp
src/treesearch/BranchAndGreed.cpp
)
add_library(ACO STATIC
include/treesearch/ACO.hpp
src/treesearch/ACO.cpp
)
add_library(RouletteWheelGreedy STATIC
include/treesearch/RouletteWheelGreedy.hpp
src/treesearch/RouletteWheelGreedy.cpp
)
add_library(IterativeRouletteWheelGreedy STATIC
include/treesearch/IterativeRouletteWheelGreedy.hpp
src/treesearch/IterativeRouletteWheelGreedy.cpp
)
add_library(MCTS STATIC
include/treesearch/RouletteWheelGreedy.hpp
src/treesearch/RouletteWheelGreedy.cpp
include/treesearch/MCTS.hpp
src/treesearch/MCTS.cpp
)
add_library(AnytimeColumnSearch STATIC
include/treesearch/AnytimeColumnSearch.hpp
src/treesearch/AnytimeColumnSearch.cpp
)

# all tree search algorithms
set( ALGORITHMS
DFS
BFS
AStar
MBAStar
BeamSearch
GreedyRandom
WeightedAStar
Greedy
BranchAndGreed
IterativeBroadening
BULB
LDS
IterativeBeamSearch
IterativeMBAStar
ACO
RouletteWheelGreedy
IterativeRouletteWheelGreedy
MCTS
AnytimeColumnSearch
)

# base code
add_library(catsBase STATIC
include/Node.hpp
include/SearchManager.hpp
include/Store.hpp
include/io.hpp
include/numeric.hpp
include/SolutionParts.hpp
include/Combinator.hpp
include/PrefixEquivalence.hpp
src/Node.cpp
src/SearchManager.cpp
src/io.cpp
)

# util code
add_library(catsUtil STATIC
# set ( UTIL
include/util/includeAlgorithms.hpp
include/util/SubsetInt.hpp
src/util/SubsetInt.cpp
)
set ( ALL
${COMBINATORS}
${ALGORITHMS}
catsUtil
catsBase
)
# UNIT TESTING
enable_testing()
add_executable( testInverseBS.exe unittest/testInverseBS.cpp unittest/InverseGuideBS.hpp)
target_link_libraries(testInverseBS.exe ${ALL})
add_executable( testSubsetInt.exe unittest/testSubsetInt.cpp)
target_link_libraries(testSubsetInt.exe ${ALL})
add_test( InverseBS testInverseBS.exe )
add_test( SubsetInt testSubsetInt.exe )

通常你会使用 find_package 来查找和配置 CMake 的库。Boost 提供了一个 CMake 配置文件 FindBoost。

下面是一个使用目标的库的示例(目前推荐的方式(

find_package(Boost REQUIRED COMPONENTS system unit_test_framework)
add_library(LDSCombinator STATIC
include/combinators/LDSCombinator.hpp
src/combinators/LDSCombinator.cpp
)
target_link_libraries(LDSCombinator Boost::system)

您必须链接所有使用 Boost 的可执行文件和库。

看起来您已经在使用find_package()来告诉 CMake 查找系统上安装的 Boost,特别是systemunit_test_framework组件。现在,您只需将导入的 Boost 目标链接到使用 Boost 的库或可执行文件。例如,将unit_test_framework链接到testSubsetInt.exe目标,如下所示:

target_link_libraries(testSubsetInt.exe PUBLIC 
${ALL} 
Boost::unit_test_framework
)

此示例包含"现代"CMake 方法。但是,Boost 文档提供了更多扩展示例,说明如何在此处通过 CMake 包含 Boost 库。

最新更新