与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
。但是我发现这种方法存在一些问题:
- 我找不到指示
LINK.EXE
可执行文件的完全限定路径的CMake变量。然后,我必须以某种方式推导出使用脆弱启发式的LINK.EXE
的路径:从不同的Visual Studio版本可能在不同的目录中找到LINK.EXE
文件的意义上来说,它是脆弱的,我需要它为32位和64位Windows编译器条件,并且适应VS2008和未来编译器版本之间的升级。 - 我必须找到一个方法来发现所有其它的静态库的.OBJ文件,在构建时与在CMake的时间,因为在CMake的时间过程的.obj文件不(总是)存在。由于构建性能的原因,为了将它们添加到
LINK.EXE
命令行中,我希望不要从.lib文件中提取.obj文件,因此在这种情况下FILE(GLOB...)
构造将是我最好的第二种替代方案。 - 也许可以简单地通过调用
LINK.EXE
:LINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ...
,但也许不是所有的obj的将包括(编辑:我已经证实,从LINK.EXE
省略lib1.lib lib2.lib ...
一些.obj文件没有解释为什么任何诊断消息,所以这种做法是一个非首发);在线文档LINK.EXE
目前尚不清楚。任何人都有以这种方式使用LINK.EXE
的经验吗?
感谢,
布伦特
附言:我知道了如何使用CMake的一个DLL,但我特别不希望诉诸在这个时间点建立一个DLL。
MERGE_STATIC_LIBS宏在http://www.mail-archive.com/[email protected]/msg28670/libutils中定义。cmake链接非常接近我所实施的内容。警告:该链接指向一个特定于mysql的文件,因此必须对其进行推广,以便在实践中可行。 – bgoodr 2011-03-07 06:29:46
上述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