cmake sometimes don't find the header

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

cmake sometimes don't find the header

Carlton banks
I am not sure I understand why I am having this problem..
but cmake seem to have some problems with finding the header file located in a different project.

tree view of my system: https://pastebin.com/AvydEbeW

I’ve included the directory to the project which header files I am interested in, and also added the path in my
target_inlcude_directories. The problems is my database.h cannot see record.h.

database/CmakeLists.txt:

https://pastebin.com/DpcMjtMa

The weird part is that it sometimes is able to compile, and other times it get stuck with this not able to find the header?

what could the problem be?




--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: cmake sometimes don't find the header

CMake mailing list
I am not sure, but you should write the cmake target-oriented(instead of using variables). So you shouldn’t use `include_directories` either. It should be written:

#
# Build static library
add_library(database database.cpp database.h)

target_compile_features(database PUBLIC cxx_defaulted_functions)
target_include_directories(database PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(database record spectogram)

And record and spectogram should be written in a similar fashion. By using targets, you don’t have to worry about the targets being defined yet, so the superproject doesn’t need to order the `add_subdirectory` calls(it can even support circular dependencies).

Another thing, you shouldn’t declare another project unless you planning on making it standalone. This means it should find the dependencies through `find_package` and be installable with its usage requirements, which would be written like this:

project(database)

find_package(record)
find_package(spectogram)

#
# Build static library
add_library(database database.cpp database.h)

target_compile_features(database PUBLIC cxx_defaulted_functions)
target_include_directories(database PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
target_link_libraries(database record spectogram)

install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/database.h DESTINATION include)

install(TARGETS database EXPORT database-targets
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    INCLUDES DESTINATION include
)

install(EXPORT database-targets
    FILE database-targets.cmake
    DESTINATION lib/cmake/database
)

file(WRITE "${PROJECT_BINARY_DIR}/database-config.cmake" "
include(CMakeFindDependencyMacro)
find_dependency(record)
find_dependency(spectogram)
include(\"\${CMAKE_CURRENT_LIST_DIR}/database-targets.cmake\")
")

write_basic_package_version_file("${PROJECT_BINARY_DIR}/database-config-version.cmake"
    VERSION 1.0
    COMPATIBILITY AnyNewerVersion
)

install(FILES
    "${PROJECT_BINARY_DIR}/database-config.cmake"
    "${PROJECT_BINARY_DIR}/database-config-version.cmake"
    DESTINATION lib/cmake/database
)

The dependencies can be found either through find_package for standalone or through add_subdirectory in the superproject by overriding find_package. The effective cmake talk describes how such setup works, here:


Or you can use a single project for all components.

On Nov 12, 2017, at 8:04 AM, Carlton Banks <[hidden email]> wrote:

I am not sure I understand why I am having this problem..
but cmake seem to have some problems with finding the header file located in a different project.

tree view of my system: https://pastebin.com/AvydEbeW

I’ve included the directory to the project which header files I am interested in, and also added the path in my
target_inlcude_directories. The problems is my database.h cannot see record.h.

database/CmakeLists.txt:

https://pastebin.com/DpcMjtMa

The weird part is that it sometimes is able to compile, and other times it get stuck with this not able to find the header?

what could the problem be?




--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake