Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Falsche/Schlechte organisation der source files mit automake?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.08.2009, 11:50 Uhr
FunnyDingo



Hallo zusammen,

ich muss wieder mal eine wahrscheinlich recht triviale Frage stellen:

Folgende Dateien seien gegeben:
- main.cpp
- sql/base.cpp
- sql/base.h

sql/base.cpp enthält fertige SQL-Abfragen. Die main soll von der genauen Implementierung nichts mit bekommen sondern nur die Methoden aufrufen (Beispiel: sql->getUserData(uid), Ergebnis ist dann Array mit maps (für jeden Datensatz ein Element im Array, die Map ist dann <feld, wert>.

Ich habe gerade zum ersten mal mit automake gearbeitet und mein Makefile zu bekommen. und muss in die Makefile.am für main trotzdem noch ein INCLUDES = -I/usr/include/mysql mit einfügen, da es sonst eine Fehlermeldung gibt:

Code:
In file included from main.cpp:12:
sql/base.h:7:19: error: mysql.h: Datei oder Verzeichnis nicht gefunden

Ich hatte eigentlich gedacht, dass die main.cpp es gar nicht interessiert und ich "problemlos" nur die Daten im Verzeichnis "sql" anpassen muss um auf eine andere Datenbank zu switchen.

Vielleicht nochmal die Datei für automake (wie gesagt, mein erster Versuch)
Makefile.am

Code:
bin_PROGRAMS = yac
yac_SOURCES = main.cpp
SUBDIRS = sql
LDADD = sql/libbase.a
INCLUDES = -I/usr/include/mysql


sql/Makefile.am

Code:
noinst_LIBRARIES = libbase.a
libbase_a_SOURCES = base.h base.cpp
INCLUDES = -I$(top_srcdir) -I/usr/include/mysql


Mache ich hier grad nen großen Fehler?

lg,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.08.2009, 17:11 Uhr
0xdeadbeef
Gott
(Operator)


Möglicherweise reicht schon

Code:
libbase_a_LIBADD = -lmysql


Ich bin allerdings grad nicht sicher, ob statische Bibliotheken in dieser Form Abhängigkeiten verwalten können - ich benutz für sowas normalerweise libtool.

Nachtrag: Ah, da wirst du erst beim Linken reinlaufen. Im Moment ist das Problem, dass du aus der main.cpp die sql/base.h einbindest, was natürlich dazu führt, dass beim Kompilieren von main.cpp die mysql.h, welche von der sql/base.h eingebunden wird, bekannt sein muss.

Entferne die Abhängigkeit entweder aus der sql/base.h (wenn die main vom Backend nichts mitkriegen soll, sollte sie sowieso unnötig sein), oder regele das in der configure.ac. Letzteres ist wohl sowieso sinnvoll, weil du dich nicht zwingend darauf verlassen kannst, dass die mysql-Header in /usr/include/mysql liegen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.08.2009 um 17:15 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.08.2009, 17:34 Uhr
FunnyDingo



Das mit der configure.ac klingt nach einer sauberen Lösung, aber leider hab ich keine Ahnung wie das aussehen sollte. Vielleicht ein kleiner Hinweis? Wie gesagt, ich fange damit gerade erst an.

Aber zu deinem ersten Vorschlag:
sql/base.h

C++:
#include <mysql.h>
class cSQL
{
    private:
        MYSQL *Connection;
    //...
};

Wenn ich hier die mysql.h raus kicke, ist MYSQL doch nicht mehr definiert und ich bekomme einen Fehler!?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.08.2009, 17:56 Uhr
0xdeadbeef
Gott
(Operator)


Die configure.ac ist ja im Wesentlichen ein Gerüst für ein Shell-Skript, du kannst da im Grunde an Shell-Code reinschreiben, was du lustig bist. Sinnvoll schiene mir allerdings die Benutzung des...ich schätze, AC_ARG_WITH ist hier am besten. Etwa so:

Code:
AC_DEFUN([DINGO_ARG_WITH_DATABASE],
[
  AC_ARG_WITH([database],
    AS_HELP_STRING(
      [--with-database],
      [Setzen der benutzten Datenbank-Bibliothek [[default=$1]]]
    ),
    [dingo_database=$withval],
    [dingo_database=$1]
  )

  case "$dingo_database" in
  mysql)
    CXXFLAGS="$CXXFLAGS -I/usr/include/mysql"
    LDFLAGS="$LDFLAGS -lmysql"
    ;;
  pgsql)
    CXXFLAGS="$CXXFLAGS -I/usr/include/pgsql"
    LDFLAGS="$LDFLAGS -lpg"
    ;;
  esac
])

DINGO_ARG_WITH_DATABASE(mysql)


Das fügt die Optionen jetzt für den gesamten Buildprozess hinzu. Ich würde dabei den AC_DEFUN-Kram in eine .m4-Datei in AC_CONFIG_MACRO_DIR legen und in der configure.ac nur DINGO_ARG_WITH_DATABASE(mysql) aufrufen, das ist übersichtlicher. Wenn du das in den einzelnen Makefile.ams gesondert behandeln willst, setz dir entsprechende Variablen zusammen und AC_SUBSTe sie, beispielsweise so:

Code:
DB_CXXFLAGS="-I/usr/include/mysql"
AC_SUBST(DB_CXXFLAGS)


und in der Makefile.am

Code:
libbase_a_CXXFLAGS = $(DB_CXXFLAGS)



Was allerdings das Interface angeht - wenn in der main Details über die benutzte Datenbank bekannt sein müssen, kommst du um die Abhängigkeit nicht herum. In diesem speziellen Fall lässt sich das zwar leicht umgehen, etwa so:

C++:
class MYSQL;

class cSQL
{
    private:
        MYSQL *Connection;
    //...
};


...und dann halt die mysql.h erst einbinden, wenn die Details wirklich gebraucht werden, prinzipiell ist es aber sinnvoll, solche Dinge vom Client-Code ganz abzutrennen. Ich würde cSQL wohl zu einer reinen Interface-Klasse machen und die eigentliche Drecksarbeit in abgeleiteten Klassen erledigen, beispielsweise cMySQL und cPgSQL. Auf die Art kannst du auch zur Laufzeit entscheiden, welche du benutzen willst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.08.2009 um 17:57 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.08.2009, 18:12 Uhr
FunnyDingo



OK, klingt alles sehr interessant. Werde ich nachher direkt mal testen. Danke
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.08.2009, 21:03 Uhr
FunnyDingo



Sorry, ich muss da noch mal nachfragen. Ich checks irgendwie nicht.

Wie soll das mit dem Interface funktionieren? Egal was ich mache: irgendwie landet immer ein include der mysql.h in der main.cpp - was ja gar nicht sein soll.

Mein letzer Versuch sah so aus:

main.cpp:
C++:
#include <iostream>
#include "sql/base.h"
using namespace std;
class cMYSQL : cSQL;
int main()
{
        cMYSQL *sql = new cMYSQL();
        int i = sql->getNumRows();
        cout << i << endl;
}


sql/base.h:
C++:
#ifndef SQL_BASE_CLASS
#define SQL_BASE_CLASS

class cSQL
{
        public:
                cSQL() {};
                virtual ~cSQL() {};
                virtual int getNumRows() {};
};
#endif


sql/testmysql.h:
C++:
#ifndef SQL_MYSQL_CLASS
#define SQL_MYSQL_CLASS
#include "base.h"
#include <mysql.h>

class cMYSQL : cSQL
{
        private:
                MYSQL *Connection;

        public:
                cMYSQL();
                ~cMYSQL();
                int getNumRows();
};
#endif


sql/testmysql.cpp:
C++:
#include <iostream>
#include "testmysql.h"

cMYSQL::cMYSQL()
{
        std::cout << "In cMYSQL::cMYSQL()" << std::endl;
        Connection = mysql_init(0);
}

cMYSQL::~cMYSQL()
{
        std::cout << "In cMYSQL::~cMYSQL()" << std::endl;
}

int cMYSQL::getNumRows()
{
        std::cout << "In cMYSQL::getNumRows()" << std::endl;
        return 1;
}


Aber das bekomme ich gar nicht kompiliert:
Code:
main.cpp:6: error: expected `{' before ';' token
main.cpp: In function 'int main()':
main.cpp:10: error: invalid use of incomplete type 'class cMYSQL'
main.cpp:6: error: forward declaration of 'class cMYSQL'
main.cpp:11: error: invalid use of incomplete type 'class cMYSQL'
main.cpp:6: error: forward declaration of 'class cMYSQL'

Ich dachte mir halt: wenn ich eine Forward Declaration von cMYSQL mache und gleichzeitig angebe, dass diese cSQL implementiert, sollte das doch klappen. Naja, zu einfach gedacht.

Ich habe keine Ahnung wie das jetzt gehen soll :-/
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 13.08.2009 um 21:06 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.08.2009, 18:42 Uhr
0xdeadbeef
Gott
(Operator)


Ich würde das wohl etwa so anfangen:

C++:
// sql_adapter.h
#ifndef INCLUDED_SQL_ADAPTER_H
#define INCLUDED_SQL_ADAPTER_H

#include <memory>

enum sql_lib_id {
  sql_lib_pgsql,
  sql_lib_mysql
};

class sql_adapter_base {
public:
  virtual ~sql_adapter_base();

  virtual int getNumRows() const = 0;
};

class sql_adapter {
public:
  sql_adapter(sql_lib_id id);

private:
  std::auto_ptr<sql_adapter_base> const pimpl_;
};

#endif



C++:
// sql_adapter.cpp
#include "sql_adapter.h"
#include "mysql/sql_adapter_mysql.h"
#include "pgsql/sql_adapter/pgsql.h"

namespace {
  sql_adapter_base *make_sql_adapter(sql_lib_id id) {
    switch(id) {
    case sql_lib_pgsql: return new sql_adapter_pgsql();
    case sql_lib_mysql: return new sql_adapter_mysql();
    default: throw id; // Hier natürlich besser ne Exception.
    }
  }
}

sql_adapter_base::~sql_adapter_base() { }

sql_adapter::sql_adapter(sql_lib_id id)
  : pimpl_(make_sql_adapter(id)) { }

int sql_adapter::getNumRows() const {
  return pimpl_->getNumRows();
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 14.08.2009 um 18:44 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: