当前位置: 首页 > 知识库问答 >
问题:

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

彭雨华
2023-03-14

我的公司销售一款依赖于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 中的第 3 方二进制文件创建合并的静态库。

共有1个答案

吕鹏
2023-03-14

您可以使用add_custom_command运行libtool

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

您将指定OUTPUT作为合并库(

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}
    )

要实际运行该命令,您需要添加一个新目标(在macefile术语中,这将创建一个假目标。为了做到这一点,您使用add_custom_target

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

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

 类似资料:
  • .a静态库合并 静态库是.o文件的合集, 静态库合并就是将静态库的.o合并, 可以实现的工具 ar, 静态库的查看、拆分、合并 libtool, xcode提供的静态库操作工具 以libtool演示.a静态库合并 一、准备 在staticLib文件夹里准备好两个.a静态库 目录结构 . ├── libAFNetworking.a └── libSDWebImage.a 二、合并 执行命令

  • 问题内容: 我有2个静态的Linux库,通过创建,和。 我想将它们合并到一个静态库中。 我怎样才能做到这一点。 我想创建一个合并的静态库,而不是将这两个库都提供给应用程序的最终链接。 问题答案: 您可以从两个文件中提取对象,然后使用提取的s 创建文件:

  • 问题内容: 假设我有三个 C 静态库,它们说 libColor.a 取决于 libRGB。 a,而后者又取决于 libPixel.a 。据说库 libColor.a 依赖于库 libRGB.a, 因为 libColor.a中 有对 libRGB.a 中定义的某些符号的 引用 。如何将上述所有库合并到独立的新 libNewColor.a ? 独立意味着新库应已定义所有符号。因此,在链接时,我只需要给

  • 出于安全考虑,我希望静态链接所有库,包括包含JNI\u OnLoad函数的本机库。我已经读到可以静态链接JNI库(http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#library_version)但我用Android Studio做不到。有可能吗? 这是我目前拥有的。 在Java代码中: 在

  • 问题内容: 我正在将PHP 5.3库转换为可在PHP 5.2上使用。阻碍我前进的主要因素是使用后期静态绑定,例如,如果将其转换为,将会得到相同的结果吗? 和之间有什么区别? 问题答案: 我会得到相同的结果吗? 并不是的。不过,我不知道针对PHP 5.2的解决方法。 和之间有什么区别? 指的是实际写入关键字的同一类。 在PHP 5.3的最新静态绑定中,指的是您在层次结构中调用方法的任何类。 在以下示

  • 问题内容: 我在Google App Engine上使用了第三方路由器(httprouter),并且希望从根目录提供静态文件。 由于使用了App Engine,我需要将第三方路由器附加到on : 问题是,这会重复模式和出现“ /多个注册 ”的紧急情况 如何提供文件( 尤其是从根目录访问文件)并使用第三方路由器? 问题答案: 如果您在提供静态文件,则无法按照https://github.com/ju