同样的源代码,所有这些,只是想要一个静态和共享的版本。一苇可航?
发布于 2010-01-28 11:42:44
是的,这是相当简单的。只需使用两个"add_library“命令:
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)但我不建议将该库的静态版本和动态版本命名为相同的名称。我更喜欢使用不同的名称,因为对于链接到库的工具,在编译行上选择静态链接与动态链接更容易。通常我会选择像libMyLib.so (共享)和libMyLib_static.a (静态)这样的名称。(这些将是linux上的名称。)
发布于 2015-04-23 21:08:27
从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>)对象库编译源文件,但不将其目标文件存档或链接到库中。相反,由
add_library()或add_executable()创建的其他目标可以使用$<TARGET_OBJECTS:objlib>形式的表达式作为源引用对象,其中objlib是对象库名称。
简单地说,add_library(objlib OBJECT ${libsrc})命令指示CMake将源文件编译为*.o目标文件。然后,这组*.o文件在两个add_library(...)命令中称为$<TARGET_OBJECT:objlib>,这两个命令调用适当的库创建命令,这两个命令从同一组目标文件构建共享库和静态库。如果您有很多源文件,那么编译*.o文件可能需要相当长的时间;使用对象库,只需编译一次。
你付出的代价是,目标文件必须构建为位置无关的代码,因为共享库需要这样(静态库并不关心)。请注意,与位置无关的代码可能效率较低,因此如果你的目标是最大限度地提高性能,那么你应该使用静态库。此外,更容易分发静态链接的可执行文件。
发布于 2013-09-01 02:03:25
通常不需要为您的目的复制ADD_LIBRARY调用。只需利用
$> 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。
https://stackoverflow.com/questions/2152077
复制相似问题