如何使用 CMake 将我自己的 .o 文件与第 3 方静态库合并以创建新的合并静态库?

How can I use CMake to merge my own .o files with a 3rd-party static library to create a new merged static library?

我的公司销售依赖于 NVIDIA CUDA 工具包的商业 Linux 应用程序。然而,我们的许多客户在他们的机器上没有 root 访问权限,也无法自己安装 CUDA,因此我们希望将 CUDA 静态库与我们的应用程序捆绑在一起。

我们的法务部门表示我们需要实际将库的内容包含在内部我们应用的现有静态库之一,而不是仅仅将 CUDA 静态库作为一个单独的文件。我可以手动创建这样一个合并库,而且效果很好:

libtool --mode=link gcc -static -o <my library>.a <my library's object files> /usr/local/cuda/lib64/libcudart_static.a

(我知道这不便携,但我只针对Linux,所以没关系)

我在 CMake 中执行此操作时遇到问题,感觉我在与系统作斗争。有没有合理的方法来做到这一点?

我已经阅读了很多有关该主题的 SO 答案,但 none 我发现有关如何从 CMake 中的第 3 方二进制文件创建合并静态库的问题。

可以使用add_custom_command到运行libtool

它有几个选项,特别是 OUTPUT,它是命令生成的输出文件,以及 DEPENDS,它是命令在 运行.

您可以将 OUTPUT 指定为合并库(在您的示例中为 <my library>.a),并将 DEPENDS 指定为要合并到库中的目标文件(<my library's object files>在你的例子中)

add_custom_command(
    OUTPUT
        ${OUTPUT_LIB}

    COMMAND
        libtool --mode=link gcc -static -o ${OUTPUT_LIB} ${INPUT_OBJS} ${LIB_CUDA}

    COMMENT
        "Creating merged ${OUTPUT_LIB}"

    DEPENDS
        ${INPUT_OBJS}
    )

然后实际上 运行 您需要添加一个新目标的命令(用 makefile 的说法,这将创建一个 phony target. In order to do this you use add_custom_target.

它需要几个选项,我们想要的是DEPENDS,我们设置为自定义命令的outputALL将其添加到默认的 ALL 目标。

add_custom_target(${OUTPUT_LIB}.create
    ALL
    DEPENDS
        ${OUTPUT_LIB}
    )