Это хороший демонстрационный пример для , а не , использующего рекурсивное make, потому что это упрощает объявление исполняемого файла в зависимости от библиотеки. Кроме того, использование единственной Makefile.am
помогает в параллельных сборках (make -j3
).
Я завершил пример и поднял его по адресу github.com / ndim / cxx-automake-lib-and -main для вашего удобства.
configure.ac
теперь использует LT_INIT
напрямую без устаревших макросов, генерирует только один Makefile
и генерирует заголовок конфигурации helloworld-config.h
для хранения командной строки компилятора очистить от всех этих -D
определяет:
AC_INIT([helloworld], [0.1], [bug-me-not], [helloworld], [this-url])
AC_CONFIG_SRCDIR([lib/helloworld.cpp])
AC_CONFIG_HEADERS([helloworld-config.h])
AC_CONFIG_MACRO_DIR([auto-m4])
AC_CONFIG_AUX_DIR([auto-aux])
AM_INIT_AUTOMAKE([
-Wall
-Werror
foreign
subdir-objects
])
AC_PROG_CXX
AM_PROG_AR
LT_INIT([disable-static])
AC_LANG([C++])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Верхний уровень Makefile.am
теперь является единственным Makefile.am
:
ACLOCAL_AMFLAGS = -I auto-m4
EXTRA_DIST =
bin_PROGRAMS =
lib_LTLIBRARIES =
include include/Makefile-files
include lib/Makefile-files
include src/Makefile-files
Тогда include/Makefile-files
имеет дело с заголовком файл, который я поместил в include/helloworld/helloworld
, чтобы помочь сохранить чистоту пространства имен включаемого файла и предотвратить путаницу между make и исполняемым файлом helloworld
и файлом заголовка helloworld
.
# -*- makefile-automake -*-
EXTRA_DIST += %reldir%/helloworld/helloworld
/* -*- c++ -*- */
#ifndef HELLOWORLD_HEADER
#define HELLOWORLD_HEADER
class helloworld {
public:
void getvalue();
};
#endif /* !defined(HELLOWORLD_HEADER) */
Теперь lib/Makefile-files
будет строить libhelloworld.la
из исходного файла библиотеки lib/helloworld.cpp
, который мне пришлось немного адаптировать для измененного имени заголовка:
# -*- makefile-automake -*-
lib_LTLIBRARIES += libhelloworld.la
libhelloworld_la_CPPFLAGS = -I$(top_srcdir)/include
libhelloworld_la_SOURCES = %reldir%/helloworld.cpp
#include "helloworld/helloworld"
void helloworld::getvalue() {
}
Программа helloworld
определена в src/Makefile-files
, так что зависимость libhelloworld.la
будет автоматически (пере) построена при необходимости. Исходный файл src/main.cpp
был адаптирован для нового имени / местоположения заголовка.
# -*- makefile-automake -*-
bin_PROGRAMS += helloworld
helloworld_CPPFLAGS = -I$(top_srcdir)/include
helloworld_SOURCES = %reldir%/main.cpp
helloworld_LDADD = libhelloworld.la
#include "helloworld/helloworld"
int main() {
helloworld a;
a.getvalue();
}