Pietro
Pietro

Reputation: 13222

How can CMake access an external header file?

I already read many questions similar to this, but they could not fix my problem.

The internal CMakeList.txt cannot find the source file (header?) located one level above: external_header.h

Project structure:

- cmake_test_external_headers/
    - CMakeLists.txt
    - external_header.h
    - cmake_test_external_headers/
        - CMakeLists.txt
        - internal_header.h
        - cmake_test_external_headers.cpp

Top level CMakeLists.txt:

cmake_minimum_required (VERSION 3.28)    
project ("cmake_test_external_headers")    
add_subdirectory ("cmake_test_external_headers")
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR})

external_header.h:

#pragma once
static const int testExt = 456;

Bottom level CMakeLists.txt:

include_directories("${CMAKE_SOURCE_DIR}")

string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC)

set(${PROJECT_NAME_UC}_PUBLIC_HEADERS "external_header.h")
set(${PROJECT_NAME_UC}_HEADERS "internal_header.h")
set(${PROJECT_NAME_UC}_SOURCES "cmake_test_external_headers.cpp")

message("CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("PROJECT_NAME = ${PROJECT_NAME}")
message("PROJECT_NAME_UC = ${PROJECT_NAME_UC}")
message("${PROJECT_NAME_UC}_PUBLIC_HEADERS: ${${PROJECT_NAME_UC}_PUBLIC_HEADERS}")
message("${PROJECT_NAME_UC}_HEADERS: ${${PROJECT_NAME_UC}_HEADERS}")
message("${PROJECT_NAME_UC}_SOURCES: ${${PROJECT_NAME_UC}_SOURCES}")

add_executable(${PROJECT_NAME} 
    ${${PROJECT_NAME_UC}_PUBLIC_HEADERS} 
    ${${PROJECT_NAME_UC}_HEADERS} 
    ${${PROJECT_NAME_UC}_SOURCES}
)

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR})
include_directories(${CMAKE_SOURCE_DIR})

set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 20)

internal_header.h:

#pragma once
static const int testInt = 123;

cmake_test_external_headers.cpp:

#include <iostream>
#include "internal_header.h"
#include "external_header.h"
//#include "../external_header.h"
//#include "whole/path/to/external_header.h"

int main()
{
    std::cout << "Test int: " << testInt << std::endl;
    std::cout << "Test ext: " << testExt << std::endl;
    return 0;
}

CMake output (relevant part):

1> [CMake] CMAKE_SOURCE_DIR = C:/Users/z0052d3h/source/repos/cmake_test_external_headers
1> [CMake] PROJECT_NAME = cmake_test_external_headers
1> [CMake] PROJECT_NAME_UC = CMAKE_TEST_EXTERNAL_HEADERS
1> [CMake] CMAKE_TEST_EXTERNAL_HEADERS_PUBLIC_HEADERS: external_header.h
1> [CMake] CMAKE_TEST_EXTERNAL_HEADERS_HEADERS: internal_header.h
1> [CMake] CMAKE_TEST_EXTERNAL_HEADERS_SOURCES: cmake_test_external_headers.cpp
1> [CMake] -- Configuring done (3.2s)
1> [CMake] CMake Error at cmake_test_external_headers/CMakeLists.txt:20 (add_executable):
1> [CMake]   Cannot find source file:
1> [CMake] 
1> [CMake]     external_header.h
1> [CMake] 
1> [CMake] 
1> [CMake] CMake Error at cmake_test_external_headers/CMakeLists.txt:20 (add_executable):
1> [CMake]   No SOURCES given to target: cmake_test_external_headers
1> [CMake] 
1> [CMake] 
1> [CMake] CMake Generate step failed.  Build files cannot be regenerated correctly.

Upvotes: 0

Views: 49

Answers (0)

Related Questions