首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能让CMake同时构建静态库和共享库?

有没有可能让CMake同时构建静态库和共享库?
EN

Stack Overflow用户
提问于 2010-01-28 11:20:24
回答 6查看 85.6K关注 0票数 161

同样的源代码,所有这些,只是想要一个静态和共享的版本。一苇可航?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-01-28 11:42:44

是的,这是相当简单的。只需使用两个"add_library“命令:

代码语言:javascript
复制
add_library(MyLib SHARED source1.c source2.c)
add_library(MyLibStatic STATIC source1.c source2.c)

即使您有许多源文件,也可以将源文件列表放在一个Cmake变量中,这样做仍然很容易。

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

代码语言:javascript
复制
set_target_properties(MyLibStatic PROPERTIES OUTPUT_NAME MyLib)

但我不建议将该库的静态版本和动态版本命名为相同的名称。我更喜欢使用不同的名称,因为对于链接到库的工具,在编译行上选择静态链接与动态链接更容易。通常我会选择像libMyLib.so (共享)和libMyLib_static.a (静态)这样的名称。(这些将是linux上的名称。)

票数 139
EN

Stack Overflow用户

发布于 2015-04-23 21:08:27

从CMake 2.8.8开始,可以使用“对象库”来避免目标文件的重复编译。使用Christopher Bruns的包含两个源文件的库的示例:

代码语言:javascript
复制
# 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 docs

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

简单地说,add_library(objlib OBJECT ${libsrc})命令指示CMake将源文件编译为*.o目标文件。然后,这组*.o文件在两个add_library(...)命令中称为$<TARGET_OBJECT:objlib>,这两个命令调用适当的库创建命令,这两个命令从同一组目标文件构建共享库和静态库。如果您有很多源文件,那么编译*.o文件可能需要相当长的时间;使用对象库,只需编译一次。

你付出的代价是,目标文件必须构建为位置无关的代码,因为共享库需要这样(静态库并不关心)。请注意,与位置无关的代码可能效率较低,因此如果你的目标是最大限度地提高性能,那么你应该使用静态库。此外,更容易分发静态链接的可执行文件。

票数 121
EN

Stack Overflow用户

发布于 2013-09-01 02:03:25

通常不需要为您的目的复制ADD_LIBRARY调用。只需利用

代码语言:javascript
复制
$> man cmake | grep -A6 '^ *BUILD_SHARED_LIBS$' 
   BUILD_SHARED_LIBS
          Global flag to cause add_library to create shared libraries if on.

          If present and true, this will cause all libraries to be built shared unless the library was
          explicitly added as a static library.  This variable is often added to projects as an OPTION
          so  that each user of a project can decide if they want to build the project using shared or
          static libraries.

在构建时,首先(在一个源代码外目录中)使用-DBUILD_SHARED_LIBS:BOOL=ON,然后使用OFF

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2152077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档