是否有可能让CMake同时构建同一个库的静态版本和共享版本?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

同样的源,只是想要一个静态和共享版本两者。这容易做吗?

提问于
用户回答回答于

是的,相当容易。只需使用两个“添加”_“库”命令:

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

即使你有许多源文件,也会将源代码列表放在cmake变量中,因此仍然很容易做到。

在Windows上,你可能应该为每个库指定一个不同的名称,因为共享和静态都有一个“.lib”文件。但是在Linux和Mac上,你甚至可以给两个库取相同的名称(例如libMyLib.a和libMyLib.so):

set_target_properties(MyLibStatic PROPERTIES OUTPUT_NAME MyLib)

用户回答回答于

由于CMake版本2.8.8,你可以使用“对象库” 来避免重复编译对象文件。使用Christopher Bruns的一个带有两个源文件的库的例子:

# list of source files
set(libsrc source1.c source2.c)

# this is the "object library" target: compiles the sources only once
add_library(objlib OBJECT ${libsrc})

# shared libraries need PIC
set_property(TARGET ${objlib} PROPERTY POSITION_INDEPENDENT_CODE 1)

# shared and static libraries built from the same object files
add_library(MyLib_shared SHARED $<TARGET_OBJECTS:objlib>)
add_library(MyLib_static STATIC $<TARGET_OBJECTS:objlib>)

CMake文档

对象库编译源文件,但不会将其对象文件存档或链接到库中。相反,由add_library()或add_executable()创建的其他目标可以使用$形式的表达式作为源来引用对象,其中objlib是对象库名称。

扫码关注云+社区