在我的 C++ 项目中,我想链接到 clang
libc++
而不是 Ubuntu 上的 libstdc++
。
我通过 libc++
将 add_subdirectory
构建为我的 CMake 项目的一部分,这样我就可以使用不同的调试和清理程序配置来构建它。
我的
CMakeLists.txt
看起来如下:
cmake_minimum_required(VERSION 3.25)
project(sample C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# clang libc++
set(LLVM_ENABLE_RUNTIMES "libcxx;libcxxabi;libunwind" CACHE STRING "" FORCE)
add_subdirectory(external/llvm-project/runtimes EXCLUDE_FROM_ALL SYSTEM)
link_libraries(
cxx_shared
cxxabi_shared
)
# Google Benchmark
set(BENCHMARK_ENABLE_TESTING OFF)
set(BENCHMARK_ENABLE_INSTALL OFF)
add_subdirectory(external/benchmark EXCLUDE_FROM_ALL SYSTEM)
# executable
add_executable(sample src/main.cpp)
target_link_libraries(sample PUBLIC benchmark::benchmark)
两个存储库(llvm-project 和 benchmark)都是从 github 的
external
目录中克隆的。
我使用
link_libraries
使 libc++
成为后面每个目标定义的依赖项,因此它不仅链接到我的主可执行文件,还链接到所有依赖项。
这对于我的所有 20 个依赖项都非常有效,除了 google benchmark,我收到以下错误:
CMake Error in external/benchmark/src/CMakeLists.txt:
export called with target "benchmark" which requires target "cxx_shared"
that is not in any export set.
CMake Error in external/benchmark/src/CMakeLists.txt:
export called with target "benchmark" which requires target "cxxabi_shared"
that is not in any export set.
benchmark/src/CMakeLists.txt
中的无条件导出语句引起的:
export (
TARGETS ${targets_to_export}
NAMESPACE "${namespace}"
FILE ${generated_dir}/${targets_export_name}.cmake
)
if (BENCHMARK_ENABLE_INSTALL)
...
endif()
现在我已经分叉了谷歌基准测试存储库并删除了导出,但是我想摆脱它并且想知道该怎么做:
有没有办法告诉cmake我不关心项目中的任何导出集?对于安装,有
CMAKE_SKIP_INSTALL_ALL_DEPENDENCY
,但我找不到任何用于导出的内容。
我是否应该将此报告给谷歌基准并要求他们有条件地进行导出。之前它是
BENCHMARK_ENABLE_INSTALL
的一部分,但他们在 this commit 中将其移到了外面。要求他们引入另一个变量是否合理?我使用导出语句的其他依赖项(fmt、GSL、boost、abseil ..)都使它们成为 install-if-clauses 的一部分,或者没有它们。
我应该将此报告给
llvm-project
并要求他们定义导出集吗?我从未从事过出口工作,所以我不知道要求项目提供它是否合理。
我可以自己为 libcxx 目标定义导出集吗?我尝试了一个天真的
export(TARGET cxx_shared ...)
并遇到了各种问题,例如设置为绝对的路径等等。
根据@Tsyvarev 评论,我更多地使用了导出命令,发现以下工作:
export(TARGETS
cxx_shared cxxabi_shared cxx-headers cxxabi_shared_objects
libcxx-abi-headers cxxabi-headers
FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/llvm_runtime.cmake"
)
添加上述内容即可使一切正常。
我仍然不确定将其添加到 cmake 配置中是否是最好的主意。