Autotools:包括一个预构建的第三方库

Autotools: Including a prebuilt 3rd party library

本文关键字:第三方 构建 包括一 Autotools      更新时间:2023-10-16

我目前正在努力将一组c++二进制文件升级为基于Autotools的更现代的东西,这些二进制文件每个都使用自己的Makefiles集。然而,我不知道如何包括第三方库(如。(Oracle即时客户端)到构建/打包过程中。

这真的是我错过的简单的东西吗?

编辑添加更多细节

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

/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都有一组硬编码的路径到不同的兄弟目录。不用说,这已经变成了一场噩梦。我已经开始测试autotools,但我卡住的地方是找出等同于复制/src/lib/oci/*。因此,到/build/lib进行编译时链接并绑定到一个发行版。

我知道该怎么做了。

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

接下来,我对configure做了以下更改。我按照这个页面http://www.openismus.com/documents/linux/using_libraries/using_libraries

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中。然后使用以下行(假设二进制文件名为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

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