2011-12-15 49 views
1

我目前正在努力升級一組C++二進制文件,每個二進制文件都使用他們自己的一套Makefiles,基於Autotools更新。但是我無法弄清楚如何在構建/打包過程中包含第三方庫(例如Oracle即時客戶端)。Autotools:包括一個預編譯的第三方庫

這件事真的很簡單,我錯過了?

編輯添加更多詳細信息

我現在的編譯環境如下所示:

/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. 運行每個二進制文件y的Makefile並將輸出複製到/ build/bin

每個Makefile都有一組到各個兄弟目錄的硬編碼路徑。毋庸置疑,這已成爲維護的噩夢。我已經開始測試autotools,但是我被卡住的地方是找出相當於將/src/lib/oci/*.so複製到/ build/lib以編譯時鏈接並捆綁到一個發行版中。

+0

這個程序基於autotools是什麼... – 2011-12-15 20:48:42

回答

2

我想出瞭如何做到這一點。

首先我切換到非遞歸make。

接下來,我做了如下修改configure.am按本頁面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.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 
0

自動工具不是一個軟件包管理系統,並試圖把這種類型的功能放在一個壞主意。與其將第三方庫合併到您的發行版中,您應該簡單地使configure腳本檢查它的存在,並在所需的庫不可用時檢查它是否中止。用戶的責任是滿足依賴性。然後您可以發佈一個二進制包,使用戶可以使用包管理系統來簡化依賴關係解決方案。