2010-07-03 3 views
2

Что я хочу сделать, так это создать новую общую библиотеку с именем libxxx, которая ссылается на другую общую библиотеку под названием libzzz, эта разделяемая библиотека имеет независимый инструмент «pkg-config», скажем, он называется «zzz-config», который дает флагов, необходимых на этапе компиляции, при использовании libzzz. То, что я хочу сделать, это:Использование Autotools для новой общей библиотеки

  • Создание Configure/Makefile, и т.д .. используя Autotools как Automake, Autoconf и т.д.;
  • Он должен использовать приведенный выше сценарий zzz-config;
  • Он должен генерировать автоматические зависимости для источников;
  • Он должен иметь режим построения отладки (без оптимизации) и выпуска (с оптимизацией) сборки;
  • Источники находятся на C++;
  • Он предназначен для общей библиотеки;
  • Он должен прочитать источники для каталога src и поместить скомпилированные файлы в другой каталог

Я прочитал почти все доступные учебники для Autotools, но я не смог найти способ сделать это, если вы можете пункт какой-то пример будет очень любезным.

Спасибо!

ответ

-1

Мое предложение состоит в том, чтобы использовать CMake вместо autotools. С ним гораздо проще работать, и он также будет создавать проекты, зависящие от платформы, для работы (например, проекты на основе Makefile, проекты Visual Studio, проекты Eclipse CDT и т. Д.).

Он также будет создавать debug или release проектами, в зависимости от значения переменной CMAKE_BUILD_TYPE.

libxxx Создание библиотеки так просто, как:

add_library(libxxx SHARED ${LIBXXX_SOURCES}) 

где LIBXXX_SOURCES является переменной, которая содержит источники.

Связывание двух библиотек является столь же легко (см target_link_libraries):

target_link_libraries(libxxx libzzz) 

Чтобы получить флаги компиляции из zzz-config сценария вы должны использовать команду execute_process так:

execute_process(COMMAND ./zzz-config 
       WORKING_DIRECTORY "<your_working_directory>" 
       OUTPUT_VARIABLE ZZZ_FLAGS) 

Тогда вы можете установить переменную CMAKE_C_FLAGS или CMAKE_CXX_FLAGS для установки необходимых флагов компиляции.

+0

Спасибо за ответ, я не знал, что у CMake уже были все перечисленные функции, awesome =) – Tarantula

+0

Добро пожаловать :) Помимо официальной документации и онлайн-уроков, есть замечательная книга, которую я рекомендую ты читаешь. Он называется «Освоение Cmake», и он говорит о многих других полезных функциях 'cmake'. –

+0

Еще раз спасибо за советы. – Tarantula

0

Я также остался бы в стороне от автотюнинга.

Кроме того, мои впечатления от Cmake были менее звездными. Возможно, все изменилось, но документации просто не было, когда я пытался узнать это некоторое время назад.

Я предпочитаю использовать SCons: http://www.scons.org/

сказанного я не знаю, насколько хорошо он выполняет на крупных проектах (то есть тысячи или более файлов). Тем не менее, для небольших или средних проектов это нормально.

Вы также можете попробовать qmake, но я бы рекомендовал это, только если вы использовали Qt.

7

Это довольно легко сделать с помощью автотюнинга. Несколько замечаний: libzzz может предоставить макрос для выполнения большинства работ для вас. Например, glib предоставляет макрос с именем AM_PATH_GLIB_2_0, который устанавливается вместе с библиотекой, поэтому вам просто нужно вызвать его в файле configure.ac. (Обратите внимание, что макрос неправильно указан, поскольку он топает в пространстве имен automake, но это еще одна проблема.) Вот пример configure.ac и Makefile.am, который делает то, что вы хотите (см. Ниже замечания по отладкам и выпускам):

configure.ac:

 
#            -*- Autoconf -*- 
# Process this file with autoconf to produce a configure script. 

AC_PREREQ([2.66]) 
AC_INIT([libxxx], [0.0.0], [[email protected]]) 
AC_CONFIG_SRCDIR([libxxx.cc]) 
AC_CONFIG_HEADERS([config.h]) 
AM_INIT_AUTOMAKE([foreign]) 
LT_INIT 
AC_PROG_CXX 

# Checks for libraries. 
# If libzzz has an autoconf macro use it. Otherwise: 
AC_PATH_PROG([ZZZ_CONFIG],[zzz-config],[none]) 
AS_IF([test x"$ZZZ_CONFIG" = xnone],[ 
    AC_MSG_ERROR([zzz-config not found in PATH]) 
]) 
CPPFLAGS="$CPPFLAGS $(zzz-config -cflags)" 
LIBS="$(zzz-config -libs) $LIBS" # Totally unnecessary: we're not linking 
# If zzz-config is found, we can probably assume that 
# libzzz is installed, but check anyway: 
AC_CHECK_LIB([zzz],[main],[],[AC_MSG_ERROR([libzzz required])]) 

# Checks for header files. 
AC_CHECK_HEADERS([zzz.h]) 

AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

Makefile.am

 

lib_LTLIBRARIES = libxxx.la 
libxxx_la_SOURCES = libxxx.cc 
include_HEADERS = xxx.h 
libxxx_la_LDFLAGS = -version-info 0:0:0 

с точки зрения ведения отладки или версии релиза, есть много способов сделать это с Autotools, которые не связаны редактирование скрипты сборки вообще. Канонический способ сделать это - установить CXXFLAGS при вызове configure (например, передать CXXFLAGS = -O2 CPPFLAGS = -DNDEBUG в качестве аргументов для настройки, чтобы получить сборку выпуска). Вы также можете настроить свою систему так, чтобы все, что вы установили в/usr/local, будет выпуском, создав эти назначения в /usr/local/share/config.site, а все, что было установлено для установки в $ HOME, будет сборкой отладки написав 'CXXFLAGS = "- g -O0"' в $ HOME/share/config.site. Вы можете вызвать AC_HEADER_ASSERT в файле configure.ac, если вы хотите дать пользователю параметр --disable-assert во время настройки, чтобы отключить утверждения (но для пользователя так же легко установить -DNDEBUG в CPPFLAGS). Еще одна приятная вещь, которую вы можете сделать, - использовать сборки VPATH automake для настройки отдельных каталогов сборки, где каждая из них настроена соответствующим образом.

Однако, если вы действительно чувствуете необходимость добавления функциональности в ваших скриптах, вы можете попробовать положить что-то подобное в configure.ac:

 
AC_ARG_ENABLE([debug],AS_HELP_STRING([--enable-debug], 
    [configure a debug build]), 
    [CXXFLAGS="$CXXFLAGS -g -O0"]) 
AC_ARG_ENABLE([release],AS_HELP_STRING([--enable-release], 
    [configure a release build]), 
    [CPPFLAGS="$CPPFLAGS -DNDEBUG"] 
    [CXXFLAGS="$CXXFLAGS -O2"]) 

Обратите внимание, что это не надежен и может вызвать путаницу для пользователя. Например, если пользователь использует config.site для установки CPPFLAGS в -DDEBUG, но вызывает -enable-release, тогда CPPFLAGS будет включать в себя «-DDEBUG -DNDEBUG». Если вы попытаетесь полностью сбросить CPPFLAGS в ответ на --enable-release, тогда флаги -I, необходимые для libzzz, будут потеряны. Вы можете избежать этой последней проблемы с помощью AC_SUBST'ing LIBZZZ_CFLAGS и внести изменения в Makefile.am, но на самом деле проще всего обучить вашего пользователя устанавливать CPPFLAGS и CXXFLAGS при вызове configure.