我正确使用libtool吗?

时间:2011-03-12 22:22:53

标签: gcc makefile compilation autotools libtool

我正在运行Linux,Ubuntu 10.04。

这不是我第一次尝试使用autotools。我做了很多研究并遵循了很多教程:这是我想要做的,我尝试过的以及我面临的问题。

目标

  • 编译(然后交叉编译,但这将是另一项工作)我自己的库使用libtool,autoconf和automake在C编码

我尝试了什么,我在哪里

  • 库名是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 ...
    
  • 我运行了autoscan,得到了一个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” to src / sub / file.c
  • “FXP_image_s.h” to src / sub2 / header.h

这意味着:automake可以在子目录中编译.c文件,但不能在这些文件中包含另一个子目录中的私有.h文件。

我的问题是:如何告诉automake编译每个子目录中的每个文件,好像它们都在同一个地方一样?

我希望我能理解(对于我能说的一些问题感到抱歉,因为我是法国人)

先谢谢你。

1 个答案:

答案 0 :(得分:8)

您的configure.acMakefile.am文件似乎必须付出很多努力才能学习。恭喜!一个有用的提示是,您只需运行autoreconf而不是整个aclocalautoheaderautoconfautomake等链。

这种情况下的问题实际上不是autotools,而是C编译器本身 - 你正在项目的根目录中执行编译器来编译src/sub中的文件,但是因为src/sub2既不是当前目录也不在include路径中,编译器不知道在哪里找到它。

尝试将-I$(srcdir)/src/sub2添加到libfxplib_0_1_la_CFLAGS中的Makefile.am行。这将更改包含路径,以指示编译器在src/sub2中查找头文件,因此您必须为包含另一个目录中使用的头文件的每个sub目录添加类似的指令。 / p>