使用 CMake 将几个静态库合并为一个

新手上路,请多包涵

我有一个与 cmake 邮件列表中 描述 的问题非常相似的问题,其中我们有一个依赖于许多静态库的项目(所有这些库都是从各个子模块中的源代码构建的,每个都有自己的 CMakeLists.txt 描述每个库的构建过程),我’想组合成一个静态库以发布给消费者。我的库的依赖项可能会发生变化,我不想让这些变化进一步加重开发人员的负担。简洁的解决方案是将所有库捆绑到一个库中。

有趣的是,当将目标设置为 mylib 并像这样使用它时, target_link_libraries 命令并没有结合所有的静态数据。 .

 target_link_libraries(mylib a b c d)

但是,奇怪的是,如果我将 mylib 项目作为可执行项目的子模块,并且仅在顶级可执行文件 CMAkeLists.txt 中链接到 mylib ,则该库似乎确实被合并了.即 mylib 是 27 MB,而不是当我将目标设置为仅构建 mylib 时的 3MB。

有一些解决方案描述了将库解包到目标文件中并重新组合( 此处此处),但是当 CMake 似乎完全能够如上例中所述自动合并库时,这似乎非常笨拙。我缺少一个魔术命令,还是推荐的制作发布库的优雅方式?

原文由 learnvst 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
1 个回答

Given the most simple working example I can think of: 2 classes, a and b , where a depends on b . .

#ifndef A_H
#define A_H

class aclass
{
public:
    int method(int x, int y);
};

#endif

a.cpp

 #include "a.h"
#include "b.h"

int aclass::method(int x, int y) {
    bclass b;
    return x * b.method(x,y);
}

bh

 #ifndef B_H
#define B_H

class bclass
{
public:
    int method(int x, int y);
};

#endif

b.cpp

 #include "b.h"

int bclass::method(int x, int y) {
    return x+y;
}

主文件

#include "a.h"
#include <iostream>

int main()
{
    aclass a;
    std::cout << a.method(3,4) << std::endl;

    return 0;
}

可以将它们编译成单独的静态库,然后使用自定义目标组合静态库。

 cmake_minimum_required(VERSION 2.8.7)

add_library(b b.cpp b.h)
add_library(a a.cpp a.h)
add_executable(main main.cpp)

set(C_LIB ${CMAKE_BINARY_DIR}/libcombi.a)

add_custom_target(combined
        COMMAND ar -x $<TARGET_FILE:a>
        COMMAND ar -x $<TARGET_FILE:b>
        COMMAND ar -qcs ${C_LIB} *.o
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        DEPENDS a b
        )

add_library(c STATIC IMPORTED GLOBAL)
add_dependencies(c combined)

set_target_properties(c
        PROPERTIES
        IMPORTED_LOCATION ${C_LIB}
        )

target_link_libraries(main c)

使用 Apple 的 libtool 版本的 custom target 也可以正常工作。 . .

 add_custom_target(combined
        COMMAND libtool -static -o ${C_LIB} $<TARGET_FILE:a> $<TARGET_FILE:b>
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        DEPENDS a b
        )

仍然接缝好像应该有一个更整洁的方式。 .

原文由 learnvst 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题