[英]automake third party libraries
如何使用automake編譯和鏈接第三方庫?
我的文件結構是:
program/
|
+--src/
| |
| +--Makefile.am
| +--main.cpp
|
+--lib/
| |
| +--Makefile.am
| +--library.cpp
|
+--Makefile.am
+--configure.ac
+--README
automake文件的內容非常通用:
# src/Makefile.am
bin_PROGRAMS = program
program_SOURCES = main.cpp
# Makefile.am
SUBDIRS = src lib
dist_doc_DATA = README
# configure.ac
AC_INIT([program], [1.0])
AM_INIT_AUTOMAKE([-Wall])
AC_PROG_CXX
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile lib/Makefile])
AC_OUTPUT
lib/Makefile.am
的內容應該是什么?
(不知道為什么您似乎自己可以控制庫代碼時為什么說“第三方”。有關與使用Automake創建和使用庫有關的更多信息,請參考GNU Automake手冊的庫部分 )
lib / Makefile.am
lib_LIBRARIES = libYOURLIB.a
libYOURLIB_a_SOURCES = library.cpp
如果您不想安裝庫本身,則可以使用noinst_lib_LIBRARIES
。 請注意,我假設您只想構建一個靜態庫。 請參閱GNU Automake手冊的“ 構建共享庫”部分,以與Libtool集成以生成共享庫。 當然,您可以手動執行此操作,但是使用Libtool可以解決各種平台差異,因此要容易得多。
要將庫鏈接到program
,請在中添加以下行
src / Makefile.am :
program_DEPENDENCIES = $(top_builddir)/lib/libYOURLIB.a
program_LDADD = $(top_builddir)/lib/libYOURLIB.a
該_DEPENDENCIES
線只是告訴Automake該program
依靠lib/libYOURLIB.a
正在初建,與_LDADD
線只是添加庫到鏈接器命令。
上面假設您已經有一個規則來構建庫。 由於您使用的是SUBDIRS
,因此收到“沒有規則使目標XXXXXX生成”失敗,這表明您沒有這樣做(至少從src
子目錄中的Makefile角度而言)。 為了解決這個問題,您可以在src / Makefile.am中嘗試以下操作(取自GNU Automake郵件列表檔案中的“ Re:庫依賴項” ):
FORCE:
$(top_builddir)/lib/libYOURLIB.a: FORCE
<TAB>(cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libYOURLIB.a)
當然,也可以按照您的注釋將lib
設為src
的子目錄,並使之更簡單。
另外,您可以停止使用遞歸構建設置,而可以使用更簡單的非遞歸構建設置。 有關此方面的一些信息,請參見GNU Automake手冊§7.3:子目錄和非遞歸Automake 的替代方法 ,但是一般的想法是更改內容以允許:
configure.ac
AM_INIT_AUTOMAKE([-Wall subdir-objects])
...
AC_CONFIG_FILES([Makefile])
Makefile.am
# Instead of using the SUBDIRS variable.
include src/Makefile.am.inc
include lib/Makefile.am.inc
dist_doc_DATA = README
lib / Makefile.am重命名為lib / Makefile.am.inc
# Full path relative to the top directory.
lib_LIBRARIES = lib/libYOURLIB.a
lib_libYOURLIB_a_SOURCES = lib/library.cpp
src / Makefile.am重命名為src / Makefile.am.inc
# Full path relative to the top directory.
bin_PROGRAMS = bin/program
bin_program_SOURCES = src/main.cpp
bin_program_DEPENDENCIES = lib/libYOURLIB.a
bin_program_LDADD = lib/libYOURLIB.a
重命名文件是可選的(您始終可以只include src/Makefile.am
),但這有助於表明它並非獨立的Automake源文件。
另外,假設lib/library.cpp
和src/main.cpp
都包含#include "library.hpp"
,並且位於另一個目錄中,那么您可能還想對所有文件使用AM_CPPFLAGS = -I $(top_srcdir)/include
或obj_program_CPPFLAGS = -I include
在obj_program_CPPFLAGS = -I include
bin/program
中使用的所有源文件,假定library.hpp
在program/include
。 當另一個項目在其自己的SUBDIRS
變量中包含整個program
源目錄時,我不確定$(top_srcdir)
是否正確,但是在非遞歸的情況下, $(srcdir)
將始終引用頂級program
目錄自動制作,使其在包含此軟件包作為組件的大型項目中可能更有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.