2012-09-20 40 views
1

我想從自動工具(Automake的/ Libtool程序)建立一個圖書館Autotools&Libtool - 如何從多個源目錄編譯共享庫?

我的目錄結構是:

src/MyLib/*some_sources*.cpp/.h + a Makefile.am 
src/MyLib/Parsers/*some_other_sources.cpp/.h Makefile.am 

當我把我所有的源文件在同一目錄(所以,沒有「解析器「subdir),一切工作正常。 (彙編,然後從其他程序鏈接)

但是,當我嘗試我的「理想結構」(基本源文件夾+「解析器」子目錄)時,我得到一個鏈接錯誤,當我嘗試編譯程序庫:

<< usr/local/lib/mylib.so: undefined reference to <a function from "/Parsers" subdir > >> 

看來,Libtool程序不編譯期間靜態鏈接我的子目錄「分析器」(可能是考慮到它作爲外部共享庫?)

這裏是我的基地「Makefile.am」:

lib_LTLIBRARIES = mylib.la 
SUBDIRS = Parsers . 
mylib_la_SOURCES = <base_dir_source_files> 

而我的 「Makefile.am」 解析器子目錄:

mylib_la_SOURCES = <parsers_dir_source_files> 

當然,我libtoolize-d,autoreconf-ED allthing,打造 「分析器」 子目錄之後。

非常感謝您的幫助。

回答

2

在你的情況最簡單的事情就是不要將Makefile.am文件添加到解析器目錄。相反,將源文件名添加到前綴爲$(srcdir)/Parsers/MyLib/Makefile.am(更適合變量)。

事情是這樣的:

src/ 
| 
\--MyLib/ 
    | 
    |--Makefile.am 
    |--base.cpp 
    |--base.h 
    \--Parsers/ 
     | 
     |--parser.cpp 
     \--parser.h 

而在SRC/MyLib中/ Makefile.am:

PARSERS=$(srcdir)/Parsers 
foo_SOURCES: base.cpp base.h \ 
    $(PARSERS)/parse.cpp $(PARSERS)/parse.h 
+0

謝謝,我試過了,但我似乎它在遞歸的Makefile衝突(我的錯誤因爲.o/.lo是在topdir中創建的),所以我只刪除了所有的子文件MakefileS,並創建了一個獨特的Makefile,它調用所有源文件,如「/MyVery/Long/Path/To/Source.cpp」。這很醜,但它工作正常。 – Neozaru

+0

哦,然後嘗試使用'$(srcdir)'變量。甚至是'$(top_srcdir)/ MyLib'。但是,在Makefile.am中完全絕對路徑,你的項目不可重定位,這不是一個好主意。 – rodrigo

+0

不,這是一個相對路徑,但是項目結構非常深; – Neozaru