Google Benchmark 作为 CMake 的依赖项

5
我正在尝试编译一个依赖于Libtorch(Pytorch)库的Google基准。我已经通过make install安装了Google Benchmark,所以我应该能够使用find_package()添加这两个依赖项。最后我加入一些编译器标志。
以下是我的CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(learned_b VERSION 1.0)
add_executable(PROJECT_NAME learned_benchmark.cpp)

find_package(Torch REQUIRED)
find_package(benchmark REQUIRED)
target_link_libraries(PROJECT_NAME "${TORCH_LIBRARIES}")
target_include_directories(PROJECT_NAME PUBLIC "${benchmark_INCLUDE_DIRS}")
target_link_libraries(PROJECT_NAME "${benchmark_LIBRARIES}")

SET(GCC_LINK_FLAGS    "-isystem /Users/yhr/Programs/benchmark/include -lbenchmark -pthread")
SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_LINK_FLAGS}")
set_property(TARGET PROJECT_NAME PROPERTY CXX_STANDARD 11)

需要注意的是,无论是否使用GCC_LINK_FLAGS,我总是会得到一个致命错误:未找到“benchmark/benchmark.h”文件。当我的代码仅依赖于PyTorch时,它可以编译和运行。是否可能在Google Benchmark中使用find_package?如果不能,我该如何正确处理?
编辑1:
以下是我运行的命令。
$ cd build
$ cmake -DCMAKE_PREFIX_PATH='/Users/yhr/Programs/libtorch;/Users/yhr/Programs/benchmark' ..
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter
 $ cd ..
 $ make VERBOSE=1
/usr/local/Cellar/cmake/3.15.4/bin/cmake -S/Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter -B/Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/Cellar/cmake/3.15.4/bin/cmake -E cmake_progress_start /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter/CMakeFiles /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter/CMakeFiles/progress.marks
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/PROJECT_NAME.dir/build.make CMakeFiles/PROJECT_NAME.dir/depend
cd /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter && /usr/local/Cellar/cmake/3.15.4/bin/cmake -E cmake_depends "Unix Makefiles" /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter/CMakeFiles/PROJECT_NAME.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/PROJECT_NAME.dir/build.make CMakeFiles/PROJECT_NAME.dir/build
[ 50%] Building CXX object CMakeFiles/PROJECT_NAME.dir/learned_benchmark.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -DAT_PARALLEL_OPENMP=1 -D_THP_CORE -I/Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter -isystem /Users/yhr/programs/libtorch/include -isystem /Users/yhr/programs/libtorch/include/torch/csrc/api/include  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -mmacosx-version-min=10.14   -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wno-write-strings -Wno-unknown-pragmas -Wno-missing-braces -std=gnu++11 -o CMakeFiles/PROJECT_NAME.dir/learned_benchmark.cpp.o -c /Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter/learned_benchmark.cpp
/Users/yhr/Programs/learnedbloomfilters/OpenBloomFilter/learned_benchmark.cpp:4:10: fatal error: 'benchmark/benchmark.h' file not found
#include <benchmark/benchmark.h>
         ^~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/PROJECT_NAME.dir/learned_benchmark.cpp.o] Error 1
make[1]: *** [CMakeFiles/PROJECT_NAME.dir/all] Error 2
make: *** [all] Error 2

欢迎来到Stackoverflow!您能否在问题帖子中提供您用于运行CMake的CMake命令以及完整的CMake输出和构建输出? - Kevin
-isystem是一个预处理器标志,而不是链接器标志。 - Marc Glisse
CMake 是否找到了 benchmark 库?你能提供 message("benchmark_INCLUDE_DIRS: ${benchmark_INCLUDE_DIRS}") 的输出吗? - Kevin
1
也许你可以看一下我写的一个小例子,演示了如何使用CMake + Google Benchmark [GitHub存储库](https://github.com/vincent-picaud/Blog_CMake_GoogleBenchmark)。 - Picaud Vincent
@yhr 这个问题已经关闭,因为 Google Benchmark 现在正在导出其配置。我建议使用它!这使得 CMake 中的依赖关系变得容易处理。 - Guillaume Racicot
显示剩余2条评论
1个回答

3
您正确使用了find_package,但您误用了它定义的内容。
当使用导出的包时,find_package命令不会导出XY_LIBRARIESXY_INCLUDE_DIRECTORIES。如果您打印这些变量的值,您会注意到这一点。
相反,现代CMake包会导出目标。对于所有使用包导出而非查找模块的项目都是如此。要链接到导入的目标,您应该使用target_link_libraries:
target_link_libraries(PROJECT_NAME PRIVATE benchmark::benchmark)

这将为PROJECT_NAME目标中的所有CPP添加必要的标志,以便能够使用google基准测试。

您可以放弃使用flags变量(不要触碰CMAKE_CXX_FLAGS和链接标志!),而是使用更健壮的结构,例如基于目标的target_link_libraries


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接