[CMake] Dynamic libraries and library dependencies

Stefan Buschmann s_buschmann at gmx.de
Wed Jan 31 14:25:24 EST 2007


Hi all

I'm trying to build a project that consists of several shared libraries 
and some applications using those libraries.
The directory layout is as follows (simplified):

Project
Project/CMakeLists.txt
Project/SharedLib
Project/SharedLib/CMakeLists.txt
Project/SharedLib/include
Project/SharedLib/src
Project/SharedLib/external
Project/SharedLib/external/include
Project/SharedLib/external/lib
Project/SharedLib/external/lib/libFoo.a
Project/SampleApp
Project/SampleApp/CMakeLists.txt
Project/SampleApp/src

Project/CMakeLists.txt:
  ADD_SUBDIRECTORY(SharedLib)
  ADD_SUBDIRECTORY(SampleApp)

Project/SharedLib/CMakeLists.txt:
  INCLUDE_DIRECTORIES(external/include)
  LINK_DIRECTORIES(external/lib)
  SET(PROJECT_LIBS Foo)
  ...
  ADD_LIBRARY(${PROJECT_TARGET} SHARED ${PROJECT_SOURCES})
  TARGET_LINK_LIBRARIES(${PROJECT_TARGET} ${PROJECT_LIBS})

Project/SampleApp/CMakeLists.txt:
  INCLUDE_DIRECTORIES(../SharedLib/include)
  SET(PROJECT_LIBS SharedLib)
  ...
  ADD_EXECUTABLE(${PROJECT_TARGET} ${PROJECT_SOURCES})
  TARGET_LINK_LIBRARIES(${PROJECT_TARGET} ${PROJECT_LIBS})

Now, when building the project, cmake tries to link libFoo to the sample 
application instead of linking it to the dynamic library (which is 
explained in the cmake faq). So it adds -lFoo to the command line, but 
that library can't be found because the path to the library is unknown 
(Project/SharedLib/external/lib) as this is only defined in the 
SharedLib/CMakeLists.txt, but not inside SampleApp/CMakeLists.txt.
So, is there a way to solve this without having to add the library path 
to every dependent project (which would in fact make the library 
abstraction useless)?

Thanks

Stefan



More information about the CMake mailing list