1

我目前正在努力将一组 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 以进行编译时链接和捆绑到发行版中。

4

2 回答 2

2

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

首先,我切换到非递归 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
于 2012-01-06T17:13:58.230 回答
0

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

于 2011-12-29T19:01:45.720 回答