如何解决第三方cmake库中的导出集问题?

问题描述 投票:0回答:1

在我的 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-projectbenchmark)都是从 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 中将其移到了外面。要求他们引入另一个变量是否合理?我使用导出语句的其他依赖项(fmtGSL、boost、abseil ..)都使它们成为 install-if-clauses 的一部分,或者没有它们。

  • 我应该将此报告给

    llvm-project
    并要求他们定义导出集吗?我从未从事过出口工作,所以我不知道要求项目提供它是否合理。

  • 我可以自己为 libcxx 目标定义导出集吗?我尝试了一个天真的

    export(TARGET cxx_shared ...)
    并遇到了各种问题,例如设置为绝对的路径等等。

c++ cmake
1个回答
0
投票

根据@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 配置中是否是最好的主意。

© www.soinside.com 2019 - 2024. All rights reserved.