[CMake] Faking a library

Alexander Neundorf a.neundorf-work at gmx.net
Wed Oct 16 17:36:53 EDT 2013


On Wednesday 16 October 2013, Magnus Therning wrote:
> When defining a library via add_library() it's possible to link
> against it by just putting its name into target_link_libraries().  Is
> there some way of wrapping up an external library in a similar way?
> 
> As a concrete example I'm playing around with gtest[1] via
> externalproject_add() like this:
> 
>     externalproject_add(gtest
>         SOURCE_DIR ${PROJECT_SOURCE_DIR}/gtest
>         BINARY_DIR gtest-build
>         INSTALL_COMMAND "" # omit installation
>         )
> 
> Then to link to it I need to use
> 
>     target_link_libraries(test
>         -L${CMAKE_BINARY_DIR}/gtest-build -lgtest -lpthread
>         )
> 
> Is there some way to wrap that all up in a target that I can pass
> straight to target_link_libraries()?
> 
> Or is my only option to create a variable that expands to those
> compiler flags?

You may create an imported target, and set some properties on it:

add_library(gtest STATIC IMPORTED)
set_target_properties(gtest PROPERTIES
 IMPORTED_LOCATION  ${CMAKE_BINARY_DIR}/libgtest-build.a)

You may need to set a few more properties like 
IMPORTED_LINK_INTERFACE_LIBRARIES, and you may want to use 
"${CMAKE_STATIC_LIBRARY_PREFIX}libgtest-build.${CMAKE_STATIC_LIBRARY_SUFFIX}"
instead of hardcoding "lib" and "a".

Alex



More information about the CMake mailing list