2016-09-07 3 views
0

Ich habe diese link gefolgt und seine Schritte angepasst, damit es für mein Projekt funktioniert.Kann cpp Projekt nicht vollständig als statische Bibliothek kompilieren und verknüpfen

Mein Ziel ist es, eine libfile.a zu erstellen, um als eine statische Bibliothek zu verteilen. Der Projektbaum ist die folgende:

project 
    | 
    +-src 
     +- <some cpp and hpp files> 
     | 
     + containers 
      | 
      +- <other cpp and hpp files> 

Ich habe leicht configure.ac-Datei und die Makefile.am s. Die Baumstruktur verändert auf diese Weise:

project 
    | 
    +- configure.ac 
    +- Makefile.am 
    +-src 
     +- <some cpp and hpp files> 
     + Makefile.am 
     | 
     + containers 
      | 
      +- <other cpp and hpp files> 

Nun, wenn ich gehen: (*)

aclocal; autoreconf --install; autoconf; ./configure 
make 

.o files erzeugt für alle .*pp files in src enthalten ist, aber es funktioniert nicht, wenn es beginnt, diese Ziele in src/containers Erzeugen . So wird die Makefile nicht richtig generiert. Was mache ich falsch? Kann mir jemand helfen?

PS hier gibt es Dateien beteiligt: ​​

# --- configure.ac --- 

AC_PREREQ([2.68]) 
AC_INIT([filea], [1.0], [[email protected]]) 
AM_INIT_AUTOMAKE([filea], [1.0]) 
AC_CONFIG_SRCDIR([src/HashFunctions.cpp]) 
AC_CONFIG_HEADERS([config.h]) 

AC_PROG_CXX 
AC_PROG_RANLIB 

AC_CHECK_HEADERS([stddef.h stdint.h string.h]) 
AC_HEADER_STDBOOL 

AC_C_INLINE 
AC_TYPE_SIZE_T 
AC_TYPE_UINT16_T 
AC_TYPE_UINT32_T 
AC_TYPE_UINT8_T 

AC_FUNC_MALLOC 
AC_FUNC_MKTIME 
AC_CHECK_FUNCS([memset]) 

AC_OUTPUT([Makefile src/Makefile]) 

# --- Makefile.am --- 

AUTOMAKE_OPTIONS = foreign 
SUBDIRS = src 


# --- src/Makefile.am --- 

lib_LIBRARIES = libfile.a 
libfile_a_SOURCES = \ 
    ConfigLib.hpp \ 
    ConfigLib.cpp \ 
    HashFunctions.cpp \ 
    HashFunctions.hpp \ 
    Logger.hpp \ 
    Logger.cpp \ 
    Queue.hpp 

libfile_a_SOURCES += \ 
    containers/SafeContainer.cpp \ 
    containers/SafeInterger.cpp \ 
    containers/SafeMap.cpp 

EDIT 1 wie Brett Hale schlugen die mit (*) gekennzeichneten Befehle sind durch folgende ersetzt worden:

autoreconf -fvi 

Ausgang:

autoreconf: Entering directory `.' 
autoreconf: configure.ac: not using Gettext 
autoreconf: running: aclocal --force 
autoreconf: configure.ac: tracing 
autoreconf: configure.ac: not using Libtool 
autoreconf: running: /usr/bin/autoconf --force 
autoreconf: running: /usr/bin/autoheader --force 
autoreconf: running: automake --add-missing --copy --force-missing 
autoreconf: Leaving directory `.' 

Wenn mit dem Gehen:

./configure 
make 

Noch keine Regeln gefunden erzeugen Ziele im Unterverzeichnis.

EDIT 2 ich auf einen nicht-rekursive Ansatz geschaltet (Dank Karel Zak's blog) und schließlich kann ich meine lib make.

+0

Können Sie versuchen: 'autoreconf -fvi' anstelle von' aclocal; ....; Befehle? –

+0

Darf ich vorschlagen, [SCons] (http://scons.org), [CMake] (https://cmake.org) und andere Build-Systeme zu untersuchen - sogar einfach [make] (https: //www.gnu. org/software/make /) - * alles * aber der Horror, der 'autoconf' /' automake' ist ... –

+0

@JesperJuhl - ja, CMake begann mit reinen Absichten ... nur um zu sehen, dass es ein * hard * ist Problem und erfindet effektiv das Rad ohne die 20 Jahre Erfahrung in den Autotools - zusammen mit einer Syntax, die sonst nirgends verwendet wird - im Gegensatz zu bash/m4. –

Antwort

0

Immer noch weiß ich nicht, was ich falsch mache nach dem typischen recursive approach; aber, endlich habe ich diese Arbeit gemacht, um zu einem non-recursive approach (wie ich in EDIT 2 schrieb) zu wechseln. This article auf Karel Zaks Blog hat mir sehr geholfen!

# -- new configure.ac file -- 
AC_PREREQ([2.68]) 
AC_INIT([filea], [1.0], [[email protected]]) 
AM_INIT_AUTOMAKE([filea], [1.0]) 
AC_CONFIG_HEADERS([config.h]) 
AC_CONFIG_SRCDIR([src/HashFunctions.cpp]) 

AM_INIT_AUTOMAKE([filea], [1.0]) 
LT_INIT 

AC_CANONICAL_HOST 
AC_PROG_LIBTOOL 
AC_PROG_GREP 
AC_PROG_EGREP 
AC_PROG_CXX 
... 
AC_HEADER_STDBOOL 
AC_C_INLINE 
AC_TYPE_PID_T 
AC_TYPE_SIZE_T 
AC_TYPE_SSIZE_T 
AC_TYPE_UINT8_T 
AC_TYPE_UINT16_T 
AC_TYPE_UINT32_T 

AC_FUNC_ERROR_AT_LINE 
AC_FUNC_FORK 
AC_FUNC_MALLOC 
AC_FUNC_MKTIME 
AC_CHECK_FUNCS([memset socket]) 

AC_OUTPUT([Makefile]) # the makefile is only one! 
         # In the subdirectory I have created few 
         # Makemodule.am included in the "main makefile.am" 

# --- makefile.am --- 
AUTOMAKE_OPTIONS = foreign 
lib_LIBRARIES = filea.a 

libfilea_a_SOURCES = 
include src/Makemodule.am 
include src/containers/Makemodule.am # now filea_a_SOURCES is a 
            # "global variable" 
# -- src/Makemodule.am 
libfilea_a_SOURCES += \ 
    src/ConfigLib.hpp \ 
    src/ConfigLib.cpp \ 
    src/HashFunctions.cpp \ 
    src/HashFunctions.hpp \ 
    src/Logger.hpp \ 
    src/Logger.cpp \ 
    src/Queue.hpp 

# -- src/containers/Makemodule.am 
libfile_a_SOURCES += \ 
    src/containers/SafeContainer.cpp \ 
    src/containers/SafeInterger.cpp \ 
    src/containers/SafeMap.cpp 

Beachten Sie, dass jetzt, auch wenn Makemodule.am Dateien auf verschiedene Ebenen in dem Richt Baum platziert werden, wann immer ein Dateiname in einem dieses Module eingegeben wird, hat es durch seinen relativen Pfad vorangestellt werden. Dieser Pfad ist relativ zum Makefile Standort.

Verwandte Themen