我的公司销售依赖于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中的第三方二进制文件创建合并静态库的问题。
答案 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}
)