本文介绍了如何使用CMake将我自己的.o文件与第三方静态库合并,以创建新的合并后的静态库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的公司销售依赖于NVIDIA CUDA工具包的商业Linux应用程序。然而,我们的许多客户在他们的计算机上没有超级用户访问权限,并且无法自己安装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内部很难做到这一点,感觉像是在与系统作斗争。有没有一种合理的方法来做到这一点?

我已经阅读了很多关于这个主题的答案,但我发现没有一个是关于如何从CMake内的第三方二进制文件创建合并的静态库的。

推荐答案

您可以使用add_custom_command运行libtool

它有几个选项,特别是OUTPUTDEPENDSOUTPUT是命令生成的输出文件,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。为此,您可以使用add_custom_target

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

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

这篇关于如何使用CMake将我自己的.o文件与第三方静态库合并,以创建新的合并后的静态库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-25 12:45