При создании следующей настройки для 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++
Программы на C++. Форум разработчиков
-
Anonymous
1737244195
Anonymous
При создании следующей настройки для 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
)
Подробнее здесь: [url]https://stackoverflow.com/questions/79368147/cmake-generates-incorrect-include-paths[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия