本文介绍了如何使用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
。
它有几个选项,特别是OUTPUT
和DEPENDS
,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。为此,您可以使用add_custom_target
。它有几个选项,我们需要的选项是DEPENDS
,我们将其设置为自定义命令的输出,ALL
将其添加到默认的All目标。
add_custom_target(${OUTPUT_LIB}.create
ALL
DEPENDS
${OUTPUT_LIB}
)
这篇关于如何使用CMake将我自己的.o文件与第三方静态库合并,以创建新的合并后的静态库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!