PPL7-Icon Patrick's Programming Library Version 7.0.0 - Dokumentation
PPL7 verwenden

Programmcode

Innerhalb des Programmcodes ist darauf zu achten, dass die notwendigen Header-Dateien eingebunden werden. Die Basisfunktionalität ist in der Datei "ppl7.h" zu finden. Diese sollte daher immer eingebunden werden:

#include <ppl7.h>

Wird von weiteren Features gebrauch gemacht, können folgende weitere Include-Dateien benötigt werden:

#include <ppl7-grafix.h>
#include <ppl7-sound.h>
#include <ppl7-tk.h>

Damit die Include-Dateien gefunden werden, sollte der Compiler mit der Ausgabe von "ppl7-config --cflags" gestartet werden, und der Linker mit "ppl7-config --libs".

Da alle Funktionen der Library im Namespace "ppl7" zu finden sind, muss dies bei der Verwendung berücksichtigt werden. Dazu gibt es zwei Möglichkeiten:

  • 1. Globale Verwendung der Funktionen
    Dazu fügt man am Anfang des Programmcodes folgenden Code ein:
    using namespace ppl7;
    Danach sind alle Funktionen sofort mit ihrem Namen aufrufbar.
  • 2. Gezielte Verwendung der Funktionen
    Dazu wird bei Aufruf einer Funktion aus der Library jeweils der Namespace "ppl7::" vorangestellt. Beispiel:
    ppl7::SendMail Mail;
    ppl7::MkISO8601Date(&d); // Datum im String speichern
    Mail.setHeader("To","patrick@pfp.de");
    Mail.setHeader("From","patrick@pfp.de");
    Mail.setHeader("Subject","Testmail %s",(char*)d);
    Mail.message.set("Dies ist eine Testmail");
    Mail.setServer("mail.pfp.de:smtp");
    if (!Mail.send()) {
    ppl6::PrintError();
    return 0;
    }
    printf ("ok\n");

Makefile

Das folgende Beispiel soll als Template für ein Makefile dienen. Wichtig sind die beiden Zeilen "CFLAGS" und "LIB", in denen das Tool "ppl6-config" aufgerufen wird. Das Keywort "debug" sagt dem Programm, dass die Debug-Version der Library verwendet werden soll. Für eine Release-Version sollte aus Performancegründen das Keywort "release" verwendet werden oder ganz weggelassen werden. Außerdem empfiehlt es sich die Kompiler Optimierungen zu aktivieren, indem man bei den CFLAGS "-O2" oder "-O3" hinzufügt.

CC = gcc
EXTRA_CFLAGS =
INCLUDE = -I. -I../include
CFLAGS = -ggdb -Wall $(INCLUDE) $(EXTRA_CFLAGS) `ppl7-config --cflags debug`
LIB = `ppl7-config --libs debug` -lstdc++
PROGRAM = ppltestprog
OBJECTS=compile/main.o
$(PROGRAM): compile Makefile $(OBJECTS)
$(CC) $(CFLAGS) -o $(PROGRAM) $(OBJECTS) $(LIB)
-chmod 755 $(PROGRAM)
all: $(PROGRAM)
clean:
-rm -f compile $(PROGRAM) *.log debug.txt *.core
install: $(PROGRAM)
cp $(PROGRAM) /usr/local/bin
compile:
-mkdir compile
compile/main.o: main.cpp testprog.h Makefile
$(CC) $(CFLAGS) -o compile/main.o -c main.cpp

Verwendung von "autoconf"

Soll autoconf zur Erkennung der PPL-Library verwendet werden, kann folgendes m4-Makro verwendet werden:

ppl7.m4

dnl AX_PATH_LIB_PPL7([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
AC_DEFUN([AX_PATH_LIB_PPL7],[dnl
AC_ARG_WITH([libppl7],
[ --with-libppl7[[=PATH]] Prefix where PPL7-Library is installed],
[ppl7_prefix="$withval"],
[ppl7_prefix="no"])
#if test "$ppl7_prefix" != "no"
#then
if test "$ppl7_prefix" = "no"
then
AC_PATH_PROG(ppl7config,ppl7-config)
elif test "$ppl7_prefix" != "yes"
then
ppl7config="$ppl7_prefix/bin/ppl7-config"
else
AC_PATH_PROG(ppl7config,ppl7-config)
fi
AC_MSG_CHECKING([for lib ppl7])
if test [ -z "$ppl7config" ]
then
AC_MSG_RESULT(no)
AC_MSG_ERROR([ppl7 library (libppl7) and/or headers not found])
ifelse([$3], , :, [$3])
else
AC_MSG_RESULT(yes)
min_ppl_version=ifelse([$1], ,6.0.0,[$1])
AC_MSG_CHECKING(for ppl7 version >= $min_ppl_version)
ppl_version=`${ppl7config} --version`
ppl_config_major_version=`echo $ppl_version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
ppl_config_minor_version=`echo $ppl_version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
ppl_config_micro_version=`echo $ppl_version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
ppl_config_version=`expr $ppl_config_major_version \* 10000 + $ppl_config_minor_version \* 100 + $ppl_config_micro_version`
ppl_req_major_version=`echo $min_ppl_version | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
ppl_req_minor_version=`echo $min_ppl_version | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
ppl_req_micro_version=`echo $min_ppl_version | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
ppl_req_version=`expr $ppl_req_major_version \* 10000 + $ppl_req_minor_version \* 100 + $ppl_req_micro_version`
if test $ppl_config_version -lt $ppl_req_version
then
AC_MSG_RESULT([no, have $ppl_version])
ifelse([$3], , :, [$3])
else
AC_MSG_RESULT([yes (version $ppl_version) ])
#AC_MSG_CHECKING(ppl7 debug libraries)
LIBPPL7_DEBUG_LIBS=`${ppl7config} --libs debug`
#AC_MSG_RESULT($LIBPPL7_DEBUG_LIBS)
#AC_MSG_CHECKING(ppl7 release libraries)
LIBPPL7_RELEASE_LIBS=`${ppl7config} --libs release`
LIBPPL7_RELEASE_ARCHIVE=`${ppl7config} --archive release`
LIBPPL7_DEBUG_ARCHIVE=`${ppl7config} --archive debug`
#AC_MSG_RESULT($LIBPPL7_RELEASE_LIBS)
#AC_MSG_CHECKING(ppl7 includes)
LIBPPL7_CFLAGS=`${ppl7config} --cflags`
LIBPPL7=`${ppl7config} --ppllib release`
LIBPPL7_DEBUG=`${ppl7config} --ppllib debug`
#AC_MSG_RESULT($LIBPPL7_CFLAGS)
ifelse([$2], , :, [$2])
fi
fi
#else
# AC_MSG_RESULT(not configured)
# AC_MSG_ERROR([ppl7 library is required])
#fi
])
dnl AX_PPL7_FEATURE([FEATURE, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
AC_DEFUN([AX_PPL7_FEATURE],[dnl
AC_MSG_CHECKING([for ppl7-feature: $1])
if test -z "${ppl_features}"
then
ppl_features=`${ppl7config} --features`
fi
echo ${ppl_features}| tr " " "\n" | grep -i "^$1" > /dev/null 2>&1
if test $? -eq 0
then
AC_MSG_RESULT(yes)
ifelse([$2], , :, [$2])
else
AC_MSG_RESULT(no)
ifelse([$3], , :, [$3])
fi
])

Das Makro kann beispielsweise so im Configure-Script verwendet werden:

sinclude(autoconf/ppl7.m4)
report_have_ppl7="no"
AX_PATH_LIB_PPL7([7.0.0],
AC_DEFINE(HAVE_LIBPPL7, 1, [ Define if you have ppl7. ])
report_have_ppl7="yes"
AC_SUBST(LIBPPL7_CFLAGS)
AC_SUBST(LIBPPL7)
AC_SUBST(LIBPPL7_DEBUG)
AC_SUBST(LIBPPL7_DEBUG_LIBS)
AC_SUBST(LIBPPL7_RELEASE_LIBS)
,
AC_MSG_ERROR(no suitable ppl7 available)
)

Es gibt noch ein weiteres Macro, um das vorhandensein eines bestimmten Features abzufragen. Dieses würde im configure nach dem obrigen Aufruf so eingebunden:

AX_PPL7_FEATURE([zlib],ppl_has_zlib="yes",ppl_has_zlib="no")
AX_PPL7_FEATURE([bzip2],ppl_has_bzip2="yes",ppl_has_bzip2="no")
...

Denkbar wäre auch:

AX_PPL7_FEATURE([zlib],,AC_MSG_ERROR(a required feature is missing))

Das Makefile aus dem Beispiel oben würde dann so aussehen:

CC = gcc
EXTRA_CFLAGS =
INCLUDE = -I. -I../include
CFLAGS = -ggdb -Wall $(INCLUDE) $(EXTRA_CFLAGS) @LIBPPL7_CFLAGS@
LIB = @LIBPPL7_RELEASE_LIBS@ -lstdc++
PROGRAM = ppltestprog
OBJECTS=compile/main.o
$(PROGRAM): compile Makefile $(OBJECTS)
$(CC) $(CFLAGS) -o $(PROGRAM) $(OBJECTS) $(LIB)
-chmod 755 $(PROGRAM)
all: $(PROGRAM)
clean:
-rm -f compile $(PROGRAM) *.log debug.txt *.core
install: $(PROGRAM)
cp $(PROGRAM) /usr/local/bin
compile:
-mkdir compile
compile/main.o: main.cpp testprog.h Makefile
$(CC) $(CFLAGS) -o compile/main.o -c main.cpp