staticcmakeshared

Is it possible to get CMake to build both a static and shared library at the same time?


Same source, all that, just want a static and shared version both. Easy to do?


Solution

  • Yes, it's moderately easy. Just use two "add_library" commands:

    add_library(MyLib SHARED source1.c source2.c)
    add_library(MyLibStatic STATIC source1.c source2.c)
    

    Even if you have many source files, you can place the list of sources in a Cmake variable, so it's still easy to do.

    On Windows you should probably give each library a different name, since there is a ".lib" file for both shared and static. But on Linux and Mac you can even give both libraries the same name (e.g. libMyLib.a and libMyLib.so):

    set_target_properties(MyLibStatic PROPERTIES OUTPUT_NAME MyLib)
    

    But I don't recommend giving both the static and dynamic versions of the library the same name. I prefer to use different names because that makes it easier to choose static vs. dynamic linkage on the compile line for tools that link to the library. Usually I choose names like libMyLib.so (shared) and libMyLib_static.a (static). (Those would be the names on linux.)