2010-12-11 70 views
7

using cmake to link object files into lib.xxxx.a file相关,但并不完全相同,我在Windows上使用CMake 2.8.x使用VS2008 SP1构建了几个静态库。有没有办法通过CMake单独将所有这些现有静态库中的所有.obj文件重新链接到一个更大的单片库,最好通过CMake函数或其他类似的构造?使用VS2008 SP1将多个静态.lib文件链接到一个单片.lib文件中使用CMake 2.8.x

我认为答案是“没有”,所以我曾经想过通过通常add_custom_command + add_custom_target方法通过自定义命令我自己的滚动,简单地手动构建库,通过提供所有其他库的obj文件时请致电LINK.EXE。但是我发现这种方法存在一些问题:

  1. 我找不到指示LINK.EXE可执行文件的完全限定路径的CMake变量。然后,我必须以某种方式推导出使用脆弱启发式的LINK.EXE的路径:从不同的Visual Studio版本可能在不同的目录中找到LINK.EXE文件的意义上来说,它是脆弱的,我需要它为32位和64位Windows编译器条件,并且适应VS2008和未来编译器版本之间的升级。
  2. 我必须找到一个方法来发现所有其它的静态库的.OBJ文件,在构建时在CMake的时间,因为在CMake的时间过程的.obj文件不(总是)存在。由于构建性能的原因,为了将它们添加到LINK.EXE命令行中,我希望不要从.lib文件中提取.obj文件,因此在这种情况下FILE(GLOB...)构造将是我最好的第二种替代方案。
  3. 也许可以简单地通过调用LINK.EXELINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ...,但也许不是所有的obj的将包括(编辑:我已经证实,从LINK.EXE省略lib1.lib lib2.lib ...一些.obj文件没有解释为什么任何诊断消息,所以这种做法是一个非首发);在线文档LINK.EXE目前尚不清楚。任何人都有以这种方式使用LINK.EXE的经验吗?

感谢,

布伦特

附言:我知道了如何使用CMake的一个DLL,但我特别不希望诉诸在这个时间点建立一个DLL。

回答

10

用虚拟源文件创建一个“合并”的静态库,并添加要合并到STATIC_LIBRARY_FLAGS的库,这样它们将成为lib.exe的附加输入。

这将是这样的:

ADD_LIBRARY(合并STATIC dummy.c)

SET_TARGET_PROPERTIES(合并性能
STATIC_LIBRARY_FLAGS“全\路径\到lib1.lib完整\路径\ \到\ LIB2 .lib“)

这种方法在MySQL中使用,这里有一个更一般的宏来合并工作在crosss平台的静态库。它可以在这里找到http://www.mail-archive.com/[email protected]/msg28670/libutils.cmake

+0

MERGE_STATIC_LIBS宏在http://www.mail-archive.com/[email protected]/msg28670/libutils中定义。cmake链接非常接近我所实施的内容。警告:该链接指向一个特定于mysql的文件,因此必须对其进行推广,以便在实践中可行。 – bgoodr 2011-03-07 06:29:46

+0

上述libutils.cmake的确不能单独工作,因为它引用了可配置的merge_archives_unix.cmake.in该文件可从http://www.mail-archive.com/[email protected]/msg28670/merge_archives_unix.cmake获得。在 – 2011-03-17 01:43:29

相关问题