How can this header be seen?

时间:2016-07-11 22:50:45

标签: c++ cmake clion

I've been trying to understand CMake, and recently I've stumbled upon the CLion ide. So far, it's helped out a bit. In trying to get google test integrated with CLion, I cloned this github repo.

However, I don't understand how the .cpp files that hold the test method can "see" the header files for the library, when they are at the wrong relative path!

Calendar_check.cpp:

//
// Created by AK on 13/10/15.
//

#include "gtest/gtest.h"

#include "GregorianCalendar.h"
#include "JulianCalendar.h"
///Code that runs tests, not important for this question

However, the directory structure is set up like so: enter image description here

Seeing how the project is set up, shouldn't the calendar_check.cpp file's #include statement read

#include "../../calendars/GregorianCalendar.h" #include "../../calendars/JulianCalendar.h" instead?

I know static libraries don't have header files with them, so I don't understand how the calendar_test.cpp file can know where those headers are using the path they use.

Here are the CMakeLists.txt files:

Root:

cmake_minimum_required(VERSION 3.1)
project(Calendar)

#add_definitions(-std=c++11 --target=x86_64-linux-gnu)
#set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(calendar_run ${SOURCE_FILES})

include_directories(calendars)

add_subdirectory(calendars)
add_subdirectory(calendars_tests)


target_link_libraries(calendar_run calendars)

root/calendars:

project(calendars)

set(HEADER_FILES
        calendar_defs.h
        General.h
        GregorianCalendar.h
        JulianCalendar.h
        IslamicCalendar.h
        HebrewCalendar.h
    )

set(SOURCE_FILES
        calendar_defs.cpp
        Calendar.cpp
        General.cpp
        GregorianCalendar.cpp
        JulianCalendar.cpp
        IslamicCalendar.cpp
        HebrewCalendar.cpp
    )

add_library(calendars STATIC ${SOURCE_FILES} ${HEADER_FILES})

root/calendar_tests:

project(calendars_tests)

add_subdirectory(lib/gtest-1.7.0)
add_subdirectory(basic_tests)

root/calendar_tests/basic_tests:

include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

add_executable(runBasicCalendarTests
        basic_check.cpp
        calendar_check.cpp)

target_link_libraries(runBasicCalendarTests gtest gtest_main)
target_link_libraries(runBasicCalendarTests calendars)

1 个答案:

答案 0 :(得分:1)

You must read this answer from this question: What is the difference between #include < filename> and #include “filename”?

in special, when piCookie says:

A preprocessing directive of the form

#include "q-char-sequence" new-line

causes the replacement of that directive by the entire contents of the source file identified by the specified sequence between the " delimiters. The named source file is searched for in an implementation-defined manner. If this search is not supported, or if the search fails, the directive is reprocessed as if it read

#include <h-char-sequence> new-line

with the identical contained sequence (including > characters, if any) from the original directive.

After you finished the reading note that at this line in CMakeLists.txt:

include_directories(calendars)

you are asking cmake to include calendars directory to include search path.