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

Chris Johnson cxjohnson at gmail.com
Tue Dec 2 12:03:48 EST 2014


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> 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/6cf83f91/attachment-0001.html>


More information about the CMake mailing list