[CMake] How to set path to library header files?

Miller Henry MillerHenry at JohnDeere.com
Tue Dec 2 12:07:28 EST 2014


You need to use include_directories to tell cmake where to find headers.

include_directories(${CMAKE_SOURCE_DIR}/src)

http://www.cmake.org/cmake/help/v3.0/command/include_directories.html
http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_SOURCE_DIR.html


From: CMake [mailto:cmake-bounces at cmake.org] On Behalf Of Chris Johnson
Sent: Tuesday, December 02, 2014 11:04 AM
To: cmake at cmake.org
Subject: Re: [CMake] How to set path to library header files?

Ah, and I royally typo'd:

prog.cpp includes the header via:

#include "mylib/myfunc.h"

(not just "myfunc.h")

On Tue, Dec 2, 2014 at 11:01 AM, Chris Johnson <cxjohnson at gmail.com<mailto:cxjohnson at gmail.com>> wrote:
Background:  I'm converting an existing project from a custom build process which uses BSD Make to CMake.  The source for the project is contained in about 600 directories, and has about a dozen libraries and maybe a hundred executables.  The old build system (make) has to continue working until the new CMake-based system is fully operational and tested.  For the most part, this has been straight forward and easy, since make is building in source using in-source Makefiles.  I've simply added a CMakeLists.txt file to each directory, and the actual CMake build occurs out-of-source.  It's only the edge cases (of course!) which have given me a headache.  I've solved some of them.  This message is about one I have not yet been able to solve.

The basic problem is this:  my executables cannot find the header files for some of the libraries, because they are in a subdirectory when installed, but are not in a subdirectory while in source.

Here's a simplified example (SSCCE) which reproduces this problem.

The file structure:
.
|-- bin/
|-- include/
|   `-- mylib/
|-- lib/
`-- src/
    |-- CMakeLists.txt
    |-- mylib/
    |   |-- CMakeLists.txt
    |   |-- myfunc.cpp
    |   `-- myfunc.h
    `-- prog/
        |-- CMakeLists.txt
        `-- prog.cpp

The top-level bin, include and lib directories are the install locations, exactly parallel to standard Unix locations.  Note that file myfunc.h installs into ./include/mylib.  Note also that prog.cpp includes this header via #include "myfunc.h".

Here are the current CMakeLists.txt files.

Top level (../src):
cmake_minimum_required(VERSION 2.8.4)
project(src)
add_subdirectory(mylib)
add_subdirectory(prog)

mylib:
cmake_minimum_required(VERSION 2.8.4)
project(mylib)

set(CPP_SOURCE myfunc.cpp)
set(HEADERS myfunc.h)

add_library(mylib  ${CPP_SOURCE} )

target_include_directories(
    mylib PUBLIC
    # Headers used from source/build location:
    "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
    # Headers used from the installed location:
    "$<INSTALL_INTERFACE:include>"
)

install(TARGETS mylib DESTINATION lib)
install(FILES ${HEADERS} DESTINATION include/mylib)

prog:
cmake_minimum_required(VERSION 2.8.4)
project(prog)

set(SOURCE_FILES prog.cpp)

set(LIBS mylib)

add_executable(prog ${SOURCE_FILES})
target_link_libraries(prog  ${LIBS})
install(TARGETS prog DESTINATION bin)

When I build, I get this error:

src/.build$ make install
-- Configuring done
-- Generating done
-- Build files have been written to: /sandbox/src/.build
Scanning dependencies of target mylib
[ 50%] Building CXX object mylib/CMakeFiles/mylib.dir/myfunc.cpp.o
Linking CXX static library libmylib.a
[ 50%] Built target mylib
Scanning dependencies of target prog
[100%] Building CXX object prog/CMakeFiles/prog.dir/prog.cpp.o
/sandbox/src/prog/prog.cpp:1:10: fatal error: 'mylib/myfunc.h'
      file not found
#include "mylib/myfunc.h"
         ^
1 error generated.
make[2]: *** [prog/CMakeFiles/prog.dir/prog.cpp.o] Error 1
make[1]: *** [prog/CMakeFiles/prog.dir/all] Error 2
make: *** [all] Error 2


How can I create CMake rules that will allow me to work around this?

As I mentioned above, the existing make-based build has to continue working, so I cannot change the #include statement to remove the subdirectory path.

..chris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20141202/40f7596a/attachment-0001.html>


More information about the CMake mailing list