2013-08-24 23 views
1

我建立一個共享庫,並有一個源代碼樹的結構是這樣的:鏈接到同級的libtool庫遞歸的Automake

Makefile.am 
src/ 
    Makefile.am 
    srcfile1.h 
    srcfile1.cpp 
    ... 
thirdpaty/ 
    Makefile.am 
    lib1/ 
     Makefile.am 
     lib1.h 
     lib1.cpp 
     ... 
    lib2/ 
     ... 

我用遞歸Automake的,因爲一些第三方的庫都分佈有自己的Automake文件。 src/Makefile.am包括通常的libtool的宏:

lib_LTLIBRARIES = libmylib.la 
libmylib_la_SOURCES = scrfile1.h srcfile1.cpp ... 

怎樣主庫鏈接到第三方的呢?該Autotools manual使我相信第三方庫需要建立爲libtool的簡易庫,所以在thirdparty/lib1/Makefile.am我有以下幾點:

noinst_LTLIBRARIES = libthirdpaty1.la 
libthirdpaty1_la_SOURCES = lib1.cpp lib1.h 

,並添加src/Makefile.am如下:

libmylib_la_LIBADD = $(top_buildir)/thirdparty/lib1/libthirdpaty1.la 

我根Makefile.am包含INCLUDES宏:

INCLUDES = -I$(top_builddir)/thirdparty 

但是使用此配置構建可以使我獲得undef發現符號錯誤。

構建此源代碼並將所有庫鏈接在一起的正確方法是什麼?

+2

你在做什麼看起來很健全。所以我會先看看這些符號。他們是否定義?如果有多個便利圖書館,他們是否按照正確的順序鏈接?等等。 –

+0

你是對的,我是在錯誤的順序包括子文件夾。謝謝你的提示! – Narcolei

回答

0

事實證明,該源佈局和libtool使用都很好,但我的根Makefile.am有以下宏:

SUBDIRS = src thirdparty 

本應是

SUBDIRS = thirdparty src 

因爲在代碼src/引用thirdparty/中的代碼,需要首先構建thirdparty/代碼。宏SUBDIRS宏使子文件夾按照它們指定的順序(從左到右)構建。