我目前正在努力升级一组c ++二进制文件,每个二进制文件都使用自己的一组Makefile,使其更加基于Autotools。但是,我无法弄清楚如何将第三方库(例如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执行以下步骤:
每个Makefile都有一组指向各种兄弟目录的硬编码路径。毋庸置疑,这已成为维持的噩梦。我已经开始测试自动工具了,但我遇到的问题就是找出相当于将/src/lib/oci/*.so复制到/ build / lib以便编译链接和捆绑到分发中。
答案 0 :(得分:2)
我想出了如何实现这一目标。
首先,我切换到非递归制作。
接下来,我根据此页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
答案 1 :(得分:0)
autotools不是包管理系统,并且试图将这种类型的功能放入其中是一个坏主意。您可以简单地让配置脚本检查其存在,并在所需的库不可用时中止,而不是将第三方库合并到您的发行版中。用户有责任满足依赖性。然后,您可以发布一个二进制包,允许用户使用包管理系统来简化依赖性解析。