При создании следующей настройки для liba и libb в зависимых проектах создаются следующие каталоги включения:
liba/include/liba и liba, а также libb/include/libb и libb
Однако правильными каталогами включения будут:
liba/include, а также libb/include
Я понятия не имею, почему он вообще генерирует корневой каталог как путь включения, который не имеет никакого смысла в первое место.
libX/include/libX будет правильным путем включения в libX, но не в зависимых проектах.
Как заставить cmake генерировать только нужные пути включения?
CMakeLists.txt:
cmake_minimum_required(VERSION 3.28)
project(TopLevel VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
cmake_policy(SET CMP0177 NEW)
include(FetchContent)
FetchContent_Declare(liba SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/liba" OVERRIDE_FIND_PACKAGE)
FetchContent_MakeAvailable(liba)
list(PREPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libb/build/generators")
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libb/build/generators")
FetchContent_Declare(libb SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libb" OVERRIDE_FIND_PACKAGE)
FetchContent_MakeAvailable(libb)
list(PREPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/app/build/generators")
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/app/build/generators")
add_subdirectory(app)
liba/CMakeLists.txt:
cmake_minimum_required(VERSION 3.28)
set(PROJ_NS "liba")
set(PROJ_BIN_NAME "liba")
project(${PROJ_NS} VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
cmake_policy(SET CMP0177 NEW)
set(CXX_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 23)
set(CMAKE_CXX_STANDARD 23)
endif()
add_library(${PROJ_BIN_NAME} STATIC)
target_include_directories(${PROJ_BIN_NAME} PUBLIC $ $)
# Because CMake refuses to set these flags for MSVC and thus allow standard conforming code to make the proper decisions...
if (MSVC)
if(MSVC_VERSION GREATER_EQUAL 1914)
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/Zc:__cplusplus")
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/permissive-")
endif()
if(MSVC_VERSION GREATER_EQUAL 1934)
target_compile_options(${PROJ_BIN_NAME} PRIVATE /external:anglebrackets /external:W0)
endif()
endif()
# Actual source files
target_sources(${PROJ_BIN_NAME} PRIVATE
src/liba/helpers.cpp
)
# Public headers
target_sources(${PROJ_BIN_NAME} PUBLIC FILE_SET pub_headers TYPE HEADERS FILES
include/liba/helpers.hpp
)
# === Installation ===
install(TARGETS ${PROJ_BIN_NAME} LIBRARY)
install(TARGETS ${PROJ_BIN_NAME} FILE_SET pub_headers)
libb/CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
set(PROJ_NS "libb")
set(PROJ_BIN_NAME "libb")
project(${PROJ_NS} VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
cmake_policy(SET CMP0177 NEW)
set(CXX_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 23)
set(CMAKE_CXX_STANDARD 23)
endif()
add_library(${PROJ_BIN_NAME})
target_include_directories(${PROJ_BIN_NAME} PUBLIC $ $)
find_package(nlohmann_json REQUIRED)
find_package(Microsoft.GSL REQUIRED)
find_package(liba REQUIRED)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE nlohmann_json::nlohmann_json)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE Microsoft.GSL::GSL)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE liba)
# Because CMake refuses to set these flags for MSVC and thus allow standard conforming code to make the proper decisions..
if (MSVC)
if(MSVC_VERSION GREATER_EQUAL 1914)
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/Zc:__cplusplus")
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/permissive-")
endif()
if(MSVC_VERSION GREATER_EQUAL 1934)
target_compile_options(${PROJ_BIN_NAME} PRIVATE /external:anglebrackets /external:W0)
endif()
endif()
# Actual source files
target_sources(${PROJ_BIN_NAME} PRIVATE
src/libb/test.cpp
)
# Public headers
target_sources(${PROJ_BIN_NAME} PUBLIC FILE_SET pub_headers TYPE HEADERS FILES
include/libb/test.hpp
)
# === Installation ===
install(TARGETS ${PROJ_BIN_NAME} LIBRARY)
install(TARGETS ${PROJ_BIN_NAME} FILE_SET pub_headers)
app/CMakeLists.txt:
cmake_minimum_required(VERSION 3.28)
project(App VERSION 1.0.0 LANGUAGES CXX)
set(PROJ_BIN_NAME "App")
set(CMAKE_VERBOSE_MAKEFILE TRUE)
set(CXX_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 23)
set(CMAKE_CXX_STANDARD 23)
endif()
add_executable(${PROJ_BIN_NAME})
find_package(nlohmann_json REQUIRED)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE nlohmann_json::nlohmann_json)
find_package(liba REQUIRED)
find_package(libb REQUIRED)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE liba)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE libb)
# Because CMake refuses to set these flags for MSVC and thus allow standard conforming code to make the proper decisions..
if (MSVC)
if(MSVC_VERSION GREATER_EQUAL 1914)
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/Zc:__cplusplus")
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/permissive-")
endif()
if(MSVC_VERSION GREATER_EQUAL 1934)
target_compile_options(${PROJ_BIN_NAME} PRIVATE /external:anglebrackets /external:W0)
endif()
endif()
# Actual source files
target_sources(${PROJ_BIN_NAME} PRIVATE
src/main.cpp
)
Подробнее здесь: https://stackoverflow.com/questions/793 ... lude-paths
Cmake генерирует неправильные пути включения ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Cmake генерирует неправильные флаги для Clang-Cl: Undefined MainCrtStartup [Duplicate]
Anonymous » » в форуме C++ - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-