CMake - 将多个库合并为一个

时间:2011-05-25 22:30:31

标签: cmake

假设我有可执行文件A,B,C,我有外部库X,Y,Z

SET(EXTERNAL_LIB X Y Z)
TARGET_LINK_LIBRARIES(A, ${EXTERNAL_LIB})
TARGET_LINK_LIBRARIES(B, ${EXTERNAL_LIB})
TARGET_LINK_LIBRARIES(C, ${EXTERNAL_LIB})

但是,如果我将其可视化(使用cmake --graphviz选项,我会得到一个复杂的二分图,其中包含每个可执行文件A,B和C的边到每个库X,Y和Z. / p>

我想知道是否有办法将所有库合并为一个。

1 个答案:

答案 0 :(得分:4)

所有这些都取决于您的平台,编译器和库的类型:

  1. 如果您可以自己构建X,Y,Z:创建一个新项目XYZ,根据X,Y和Z的聚合源文件构建。但我想如果这是可能的,你不会在SO上问过。

  2. 如果你不能重建lib并且它们被构建为共享库(dll / so),那你就不走运了。您可以尝试编写一个包装器库,它隐藏X,Y和Z的所有内部结构,并由应用程序A,B和C使用。

  3. 如果它们是作为静态库构建的,请查看this SO question。因为静态库不仅仅是目标文件的存档,您可以从每个库中提取目标代码并将它们与ar重新组合。

  4. 但你为什么要这样?假设你得到第四个应用程序D,它只依赖于X.那么你无论如何都需要单独的库Y(除非你更愿意不必要地链接所有的库)。