同样的源代码,所有这些,只是想要一个静态和共享的版本。一苇可航?
发布于 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上的名称。)
发布于 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
。
发布于 2020-07-23 15:57:29
正如前面的答案中所建议的那样,可以将所有东西都打包在相同的编译气息中,但我建议不要这样做,因为最终这是一种只适用于简单项目的技巧。例如,在某些情况下,您可能需要针对不同版本的库使用不同的标志。在Windows上,标志通常用于在导出或不导出符号之间切换)。或者如上所述,您可能希望将.lib
文件放到不同的目录中,这取决于它们是对应于静态库还是共享库。这些障碍中的每一个都需要一个新的技巧。
这可能是显而易见的,但是一个以前没有提到的替代方案是将库的类型作为参数:
set( ${PROJECT_NAME}_LIBTYPE CACHE STRING "library type" )
set_property( CACHE ${PROJECT_NAME}_LIBTYPE PROPERTY STRINGS "SHARED;STATIC" )
add_library( ${PROJECT_NAME} ${PROJECT_NAME}_LIBTYPE ${SOURCE_FILES} )
将库的共享和静态版本放在两个不同的二叉树中,可以更容易地处理不同的编译选项。我看不出保持编译树的不同有什么严重的缺点,特别是如果你的编译是自动化的。
请注意,即使您打算使用中间OBJECT
库(具有上面提到的警告,因此您需要一个令人信服的理由这样做)来实现编译的互互化,您仍然可以将端库放在两个不同的项目中。
https://stackoverflow.com/questions/2152077
复制相似问题