Я правильно использую libtool? - PullRequest
5 голосов
/ 13 марта 2011

Я использую 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 компилировать все файлы во всех подкаталогах, как если бы они все были в одном месте?

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

Заранее спасибо.

1 Ответ

8 голосов
/ 13 марта 2011

Ваши файлы 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, содержащего файлы заголовков, используемые в другом каталоге.

...