簡體   English   中英

自動制作第三方庫

[英]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.cppsrc/main.cpp都包含#include "library.hpp" ,並且位於另一個目錄中,那么您可能還想對所有文件使用AM_CPPFLAGS = -I $(top_srcdir)/includeobj_program_CPPFLAGS = -I includeobj_program_CPPFLAGS = -I include bin/program中使用的所有源文件,假定library.hppprogram/include 當另一個項目在其自己的SUBDIRS變量中包含整個program源目錄時,我不確定$(top_srcdir)是否正確,但是在非遞歸的情況下, $(srcdir)將始終引用頂級program目錄自動制作,使其在包含此軟件包作為組件的大型項目中可能更有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM