2016-09-07 3 views
0

これは私がこのlinkをフォローし、私のプロジェクトでうまくいくようにそのステップを適応させました。完全にコンパイルできず、静的ライブラリとしてcppプロジェクトをリンクすることはできません

私の目標は、静的ライブラリとして配布するlibfile.aを作成することです。プロジェクトツリーは以下の通りです:

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

私は簡単にconfigure.acファイルとMakefile.am Sを作成しました。私が行くとき、今

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

:ツリー構造は、この方法を変更(*)

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

.o filesがために生成されたすべての.*pp filessrcに含まれているが、それはsrc/containersでこれらのターゲットの生成を開始するときには、失敗しました。したがって、Makefileは正しく生成されません。私は間違って何をしていますか?誰か助けてくれますか?

autoreconf -fvi 

出力:

(*)でマークされたコマンドは以下のものに置き換えられている Brett Haleにより示唆されるように

# --- 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

PSはここに関与してファイルがあります

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 `.' 

一緒に行く:まだルールがサブディレクトリ内のターゲットを生成するために発見されない

./configure 
make 

EDIT 2は私が非再帰的アプローチ(Karel Zak's blogのおかげで)に切り替え、最終的に私は私のlibがmakeすることができます。

+0

「aclocal;」の代わりに 'autoreconf -fvi'を試してみることができますか? ....; 'コマンド? –

+0

私は[SCons](http://scons.org)、[CMake](https://cmake.org)、その他のビルドシステムを調査することを提案してもいいですか? - [make](https://www.gnu。 org/software/make /) - *何でも、 'autoconf' /' automake'というホラー... –

+0

@JesperJuhl - はい、cmakeは純粋な意図で始めました。 bash/m4と違って、autotoolsでの20年の経験と他のどこでも使われていない構文がなくても、ホイールを効果的に再発明することができます。 –

答えて

0

まだ私は間違って何をしていたのかわからない典型的なrecursive approach;しかし、最後に私はnon-recursive approach(私がEDIT 2に書きました)に切り替えるこの作業を行いました。 Karel ZakのブログのThis articleが私を助けました!

# -- 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 

ファイル名は、1つのこれらのモジュールに入力されるたびにMakemodule.amファイルはディレクトリツリー内の異なるレベルに配置されていても今、注意は、その相対パスが先行されなければなりません。このパスはMakefileの場所に関連しています。

関連する問題