12

我想构建同一个库的静态和共享版本,如所述是否可以让 CMake 构建同一个库的静态和共享版本?

但是,源代码编译两次,每个版本编译一次,这不是必需的。有没有办法避免这种情况?

目前我有:

add_library(${LIB} SHARED ${${LIB}_srcs})

add_library(${LIB}_static STATIC ${${LIB}_srcs})

为了只需要编译一次,我需要更改什么?供参考。我有相同的编译器标志和定义。

4

2 回答 2

8

从同一组目标文件创建共享/静态库版本是不可行的,也不推荐- 至少在许多平台上。

链接到共享库的目标文件必须编译为与位置无关的代码-fpic/-FPIC在 Linux/Solaris 等上) - 而您的可执行和静态库(通常)不包含与位置无关的代码。另一方面,共享库由于间接而在共享代码页和运行时开销之间进行权衡。由于静态库和二进制文件不需要这些间接,因此与位置无关的代码只提供了这些间接的缺点。因此,如果要创建共享库版本和静态库版本,则需要创建两组不同的目标文件(一组与位置无关,另一组相反)。

于 2014-03-08T13:15:29.490 回答
6

从 CMake 2.8.8 开始,您可以使用 Object Library:CMake:reuse object files built for a lib into another lib target

另请参阅http://www.cmake.org/Wiki/CMake/Tutorials/Object_Library

于 2012-10-16T01:31:07.713 回答