[CMake] Merge two static libraries

Marcel Loose loose at astron.nl
Tue Oct 5 04:24:03 EDT 2010


>>> On 5-10-2010 at 10:10, in message <4CAADD79.7000801 at ill.fr>,
pellegrini
<pellegrini at ill.fr> wrote: 
> Hello everybody,
> 
> I have a library that can be built for a use in different modes 
> (console, window). It is made of two sets of files. The first one is

> common to
>  the console/window building modes while the second set has to be be

> built with a slightly different compiler flags depending on the
selected
> building mode.
> 
> After many discussions here, I was advised to build a static library 

> for the the files common to console and window building modes
> (e.g. common.a) and to build a second static library for the files 
> depending on the building mode (e.g. console.a and window.a) linking
the
> latter to the first one. I did it and ... it worked ! But what I
would 
> like is a little bit different. I would like my console.a (or
window.a) 
> library to
> contain the object files of the common.a library. Indeed something
like 
> 'ar cr console.a library.a'.
> 
> Would you have any idea ?
> 
> thank you
> 
> Eric

Hi Eric,

My first question is: why do you want to join these two libraries. I
understand from your mail that people suggested you to create two
separate libraries. Now you want to join them again.

To answer your question: you can't join two static libraries, not in a
portable way. You should specify a complete list of sources in your
CMakeLists.txt file for each of the two libraries. Something like:

SET(LIB_SOURCES common.c)
IF(BUILD_CONSOLE)
  LIST(APPEND LIB_SOURCES  console.c)
  ADD_LIBRARY(console ${LIB_SOURCES})
ELSEIF(BUILD_WINDOW)
  LIST(APPEND LIB_SOURCES window.c)
  ADD_LIBRARY(window ${LIB_SOURCES})
ENDIF(BUILD_CONSOLE)

The downside to this solution is that you have duplicates of the object
files that are part of common, but that's the price you'll have to pay
if you want to have just one static library.

HTH,
Marcel Loose.


More information about the CMake mailing list