最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c++ - cmake generates incorrect include paths - Stack Overflow

programmeradmin4浏览0评论

When generating for the following setup the include directories generated for the liba and libb in dependent projects are: liba/include/liba and liba as well as libb/include/libb and libb

However the correct include directories would be: liba/include as well as libb/include

I have no idea why it would even generate the root directory as an include path which doesn't make any sense in the first place.

libX/include/libX would be the correct include path for within libX but not in dependent projects.

How do I get cmake to only generate the desired include paths?

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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/liba> $<INSTALL_INTERFACE:include>)

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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/libb> $<INSTALL_INTERFACE:include>)

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)

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)

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
)

发布评论

评论列表(0)

  1. 暂无评论