【问题标题】:Autotools: Including a prebuilt 3rd party libraryAutotools:包括一个预建的 3rd 方库
【发布时间】:2011-12-15 20:19:26
【问题描述】:

我目前正在努力将一组 c++ 二进制文件升级为基于 Autotools 的更现代的东西,这些二进制文件每个都使用自己的 Makefile 集。但是我不知道如何在构建/打包过程中包含第三方库(例如 Oracle Instant Client)。

这是我错过的非常简单的事情吗?

编辑以添加更多细节

我当前的构建环境如下所示:

/src
    /lib
        /libfoo
            ... source and header files
            Makefile
        /oci #Oracle Instant Client
            ... header and shared libraries
            Makefile
    /bin
        /bar
            ... source and header files
            Makefile
    Makefile
/build
    /bin
    /lib

build.sh

今天顶层 build.sh 做了以下步骤:

  1. 运行每个库的 Makefile 并将输出复制到 /build/lib
  2. 运行每个二进制文件的 Makefile 并将输出复制到 /build/bin

每个 Makefile 都有一组指向各个同级目录的硬编码路径。不用说,这已成为维护的噩梦。我已经开始测试自动工具,但我卡住的地方是找出相当于将 /src/lib/oci/*.so 复制到 /build/lib 以进行编译时链接和捆绑到发行版中。

【问题讨论】:

  • 这个基于自动工具的程序到底是什么......
  • 它是我在工作中使用的一组内部开发的程序。
  • 嗯,有通常的自动工具机制来检查和/或包含库,从 AC_SEARCH_LIBS 开始,或者只是使用 myprog_LDADD = -loic-foo... 前提是您的衍生品中仍然存在我们一无所知的关于。
  • 我的编辑是否解释了我正在尝试做的更多事情?
  • 如果您要迁移到新的构建框架,我会推荐 CMake。我最近将我所有的项目从 Autotools 迁移到 CMake,现在它们更容易维护。对于Oracle,你知道有没有好的第三方客户端库,比如SOCI?对于 SOCI,您将找到 here 一个 M4 宏文件以将其包含在您的 Autotools 框架中,并找到 here 用于相应的 CMake 库查找器。

标签: c++ autotools oracle-call-interface


【解决方案1】:

我想出了如何做到这一点。

首先我切换到非递归的 make。

接下来,我根据此页面 http://www.openismus.com/documents/linux/using_libraries/using_libraries 对 configure.am 进行了以下更改

AC_ARG_WITH([oci-include-path],
    [AS_HELP_STRING([--with-oci-include-path],
        [location of the oci headers, defaults to lib/oci])],
    [OCI_CFLAGS="-$withval"],
    [OCI_CFLAGS="-Ilib/oci"])
AC_SUBST([OCI_CFLAGS])
AC_ARG_WITH([oci-lib-path],
    [AS_HELP_STRING([--with-oci-lib-path],
        [location of the oci libraries, defaults to lib/oci])],
    [OCI_LIBS="-L$withval -lclntsh -lnnz11"],
    [OCI_LIBS='-L./lib/oci -lclntsh -lnnz11'])
AC_SUBST([OCI_LIBS])

然后在 Makefile.am 中使用以下行(假设一个名为 foo 的二进制文件)

foo_CPPFLAGS = $(OCI_CFLAGS)
foo_LDADD = libnavycommon.la $(OCI_LIBS)

ocidir = $(libdir)
oci_DATA = lib/oci/libclntsh.so.11.1 \
    lib/oci/libnnz11.so \
    lib/oci/libocci.so.11.1 \
    lib/oci/libociicus.so \
    lib/oci/libocijdbc11.so

【讨论】:

  • 链接现在断开
【解决方案2】:

autotools 不是包管理系统,尝试将这种类型的功能放入其中是个坏主意。与其将第三方库合并到您的发行版中,您应该简单地让配置脚本检查它的存在并在所需的库不可用时中止。用户有责任满足依赖性。然后你可以发布一个二进制包,允许用户使用包管理系统来简化依赖解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2013-02-13
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多