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

时间:2017-11-22 17:32:51

标签: merge cmake cuda static-libraries libtool

我的公司销售依赖于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答案,但我没有发现任何关于如何从CMake中的第三方二进制文件创建合并静态库的问题。

1 个答案:

答案 0 :(得分:1)

您可以使用add_custom_command来运行libtool

它需要几个选项,特别是OUTPUT,它是命令生成的输出文件,DEPENDS,它是命令在运行时需要准备好的依赖项列表。< / p>

您可以将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。为此,您使用add_custom_target

需要多个选项,我们想要的是DEPENDS,我们将其设置为自定义命令的输出ALL将其添加到默认值所有目标。

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