Правильно ли я использую libtool?

Я использую Linux, Ubuntu 10.04.

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

Цель:

  • скомпилировать (а затем кросс-компилировать, но это будет другая работа) мою собственную библиотеку, написанную на C с использованием libtool, autoconf и automake

Что я пробовал и где я нахожусь:

  • Имя библиотеки - FXPLib, имя пакета - libfxplib-0.1.

  • Папка моего проекта:

    Makefile.am (the only one)
    include
    include/fxplib.h (main header)
    include/FXPLib
    include/FXPLib/header1.h (these are public headers)
    include/FXPLib/header2.h
    include/FXPLib/...
    src
    src/sub1/file1.c
    src/sub2/file1.c
    src/sub3 ...
    
  • Я запустил автосканирование, получил configure.ac, отредактировал его, как здесь:

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.65])
    AC_INIT([libfxplib-0.1], [0.1], [<>])
    AC_CONFIG_SRCDIR([src/object_system/FXP_image_s.h])
    AC_CONFIG_HEADERS(config.h)
    
    AC_CONFIG_MACRO_DIR([m4])
    
    AM_INIT_AUTOMAKE
    AM_PROG_LIBTOOL
    
    LT_PREREQ([2.2])
    LT_INIT
    
    # Checks for programs.
    AC_PROG_CC
    AC_PROG_MAKE_SET
    
    # Checks for libraries.
    
    # Checks for header files.
    AC_CHECK_HEADERS([stdlib.h])
    
    # Checks for typedefs, structures, and compiler characteristics.
    AC_HEADER_STDBOOL
    
    # Checks for library functions.
    AC_FUNC_MALLOC
    AC_FUNC_REALLOC
    AC_CHECK_FUNCS([memset])
    
    AC_CONFIG_FILES([Makefile])
    AC_OUTPUT
    
  • Я написал Makefile.am так:

    lib_LTLIBRARIES = libfxplib-0.1.la
    libfxplib_0_1_la_CFLAGS = -I$(srcdir)/include -I$(srcdir)/include/FXPLib `sdl-config --cflags --libs` -lSDL_image
    libfxplib_0_1_la_SOURCES = src/sub1/file1.c \
                               src/sub1/file2.c \
                               src/sub2/file1.h \
                               ...
    nobase_include_HEADERS = include/fxplib.h \
                             include/FXPLib/header1.h \
                             include/FXPLib/header2.h \
                             ...
    ACLOCAL_AMFLAGS = -I m4
    
  • Затем я запустил aclocal и autoheader, чтобы получить файлы, необходимые для automake
  • Затем самое главное: autoconf
  • И: automake --add-missing --copy

Дальше все в порядке. Но затем я пытаюсь скомпилировать:

$ ./configure

Тоже все ок ...

$ make

а потом я получаю:

...
src/graphics_engine/FXP_rendering.c:35:25: error: FXP_image_s.h: File not found
...

куда :

  • "graphics_engine" эквивалентно src / sub
  • "FXP_rendering.c" в src / sub / file.c
  • "FXP_image_s.h" в src / sub2 / header.h

Это означает: automake может компилировать файлы .c в подкаталоге, но не может включать в эти файлы частный файл .h, находящийся в другом подкаталоге.

Моя проблема: как указать automake компилировать все файлы в каждом подкаталоге, как если бы все они были в одном месте?

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

Заранее благодарю.


person Zoé Martin    schedule 12.03.2011    source источник
comment
У вас есть отличный отформатированный и подробный вопрос, жаль, что я не могу вам помочь с ответом.   -  person hlovdal    schedule 13.03.2011
comment
Спасибо. Это очень конкретный вопрос: стоит ли мне попытаться опубликовать его на сайте stackexchange для опытных программистов?   -  person Zoé Martin    schedule 13.03.2011
comment
Все в порядке ! Есть ли способ добавить эту тему завтра, когда больше людей войдут в систему?   -  person Zoé Martin    schedule 13.03.2011
comment
meta.stackexchange.com/questions/7046/   -  person hlovdal    schedule 13.03.2011


Ответы (1)


Ваши файлы configure.ac и Makefile.am выглядят так, будто вы, должно быть, приложили много усилий для обучения. Поздравляю! Один полезный совет: вы можете просто запустить autoreconf вместо всей цепочки aclocal, autoheader, autoconf, automake и т. Д.

Проблема в этом случае на самом деле не в автоинструментах, а в самом компиляторе C - вы запускаете компилятор в корневом каталоге вашего проекта для компиляции файла в src/sub, но поскольку src/sub2 не является ни текущим каталогом, ни путем включения, компилятор не знает, где его найти.

Попробуйте добавить -I$(srcdir)/src/sub2 в вашу libfxplib_0_1_la_CFLAGS строку в Makefile.am. Это изменит путь включения, чтобы дать компилятору указание искать файлы заголовков в src/sub2, поэтому вам придется добавить аналогичную инструкцию для каждого sub каталога, содержащего файлы заголовков, используемые в другом каталоге.

person ptomato    schedule 13.03.2011
comment
Спасибо за ваш ответ. Я знал, что этот метод мне поможет, но у меня 8 подкаталогов, и я подумал, что это будет слишком много. Я пробовал это: mega-nerd.com/erikd/Blog/CodeHacking/ nonrecursive_automake.html, но он не работает со мной. Если нет другого решения, я сделаю то, что вы скажете. - person Zoé Martin; 13.03.2011
comment
Это сработало для меня! Большое тебе спасибо. В конце концов, это не такая уж плохая идея, чем я думал. Надеюсь, это будет полезно другим ребятам, пытающимся справиться с автоинструментами! - person Zoé Martin; 13.03.2011
comment
Большой! Вы по-прежнему можете делать это так, как они говорят в блоге, но ключ к тому, чтобы заставить это работать, - это строка, которую они там цитируют, #include <path/to/header.h>, и абзац после нее. Если вы сделаете все свои включения таким образом, то это будет работать и для вас, поскольку компилятор будет знать, где искать все заголовки. Я думал об этом в своем ответе, но подумал, что это будет излишне сложным. - person ptomato; 13.03.2011
comment
Ok ! Я думал, что это способ НЕ писать ‹path / to / header.h› в моих источниках! Но теперь это работает, и я могу начать улучшать свои скрипты автоинструментов! Спасибо ! - person Zoé Martin; 15.03.2011