Я собираю libc++ как часть моих проектов CMake через add_subdirectory чтобы я мог собрать его с различными конфигурациями отладки и очистки.
Мой 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)
Я использую link_libraries
code> чтобы сделать libc++ зависимостью каждого последующего целевого определения, чтобы он был связан не только с моим основным исполняемым файлом, но и со всеми зависимостями.
Это отлично работает для всех моих 20 зависимостей, кроме теста Google, где я получаю следующую ошибку:
Код: Выделить всё
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.
Код: Выделить всё
export (
TARGETS ${targets_to_export}
NAMESPACE "${namespace}"
FILE ${generated_dir}/${targets_export_name}.cmake
)
if (BENCHMARK_ENABLE_INSTALL)
...
endif()
< ul>
[*]Есть ли способ сообщить cmake, что меня не интересуют экспортные наборы в моем проекте? Для установок есть CMAKE_SKIP_INSTALL_ALL_DEPENDENCY, но я не смог найти ничего для экспорта.
[*]Должен ли я сообщить об этом в тест Google и спросить им сделать экспорт условно. Раньше это было частью BENCHMARK_ENABLE_INSTALL, но в этом коммите они вынесли его за пределы. Разумно ли просить их ввести еще одну переменную? Остальные мои зависимости, использующие операторы экспорта (fmt, GSL, boost, abseil ..), либо делают их частью предложений install-if, либо вообще их не содержат.
[*]Должен ли я сообщить об этом в llvm-project и попросить их определить наборы экспорта. Я никогда не работал с экспортом, поэтому не знаю, разумно ли просить проект предоставить его.
[*]Могу ли я определить экспорт настроить себя на цели libcxx? Я попробовал простой экспорт (TARGET cxx_shared ...) и столкнулся со всевозможными проблемами, такими как абсолютные пути и многое другое.
Подробнее здесь: https://stackoverflow.com/questions/783 ... ke-library