Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » makefile für eine *.LIB Datei

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
27.04.2011, 06:15 Uhr
Hans
Library Walker
(Operator)


Hi,

ich versuche gerade, mir eine Bibliothek zusammen zu bauen (die Quelltexte stammen aus einem Buch) und verzweifele mehr oder weniger an den Linkeroptionen. Vorgeschichte: Beim Open Watcom scheitert das Projekt zum einen daran, das er aus einem mir nicht ersichtlichen Grund den Mathe-header nicht einbindet obwohl #include <math> als erstes in den Quelltexten steht und zum anderen daran, das der Compiler mit dem C++ Code nicht immer was anfangen kann, weil er den Standard nicht vollständig umsetzt.

Aus dem Grund hab ich mal wieder den Borland C++ Compiler (v5.5) installiert, für grössere Pakete recht der Speicherplatz nicht aus, (bzw. ich müsste erst ein paar andere Anwendungen vorübergehend runter schmeissen, was ich aber nicht will). Der Borlandcompiler hat die Quelltexte alle ohne zu mosern übersetzt, blos der Linker baut daraus keine Bibliothek, was er aber soll. Die make-datei sieht im Moment so aus:


Code:
# Borland Makefile für die Bibliotheksmodule der Astronomieprogramme aus dem
# Buch: Astronomie mit dem Personal Computer von Oliver Montenbruck und
# Thomas Pfleger, 3. Auflage, Springer 1999, ISBN: 3-540-66218-9
#
# 2. Version
#

APC_lib.lib: .obj
    ilink32 /C /Gz /Gk /Gl /w /x c0d32.obj APC_*.obj ,APC_lib,,import32.lib

APC_*.obj: APC_*.cpp APC_*.h
    bcc32 -c -tWC -w- -O1 APC_*.cpp

Clean:
    if exist *.il* del *.il*
    if exist *.map del *.map
    if exist *.tds del *.tds
    if exist *.obj del *.obj
    if exist *.res del *.res



Irgendwo ist da noch ein Wurm drin, weil make bei dieser Datei auch den Compiler nicht aufruft; das hab ich von Hand gemacht, allerdings mit der Kommandozeile aus dieser Datei.

Ich hab u.a. aus einer weiteren Hilfedatei die Information, das es 3 Varianten des Startcodemoduls gibt: eines für Kommandozeilenprogramme, eines für GUI-Programme und eines für DLLs. Welches Modul setzt man da denn nun in die Kommandozeile ein, wenn man eine LIB, also eine statische Bibliothek erzeugen will? - Gar keines ist laut Linkeranleitung nicht möglich.
Dann ist die Frage, ob ich mir die import32.lib hier nicht eigentlich schenken kann, weil ich ja kein ausführbares Programm binden will, sondern nur einen Baustein dafür. Die gleiche Frage gilt für die Mathebibliothek, die am Ende der Kommandozeile auch noch genannt werden müsste. Dabei stellt sich zusätzlich die Frage: wie heisst die?

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.04.2011, 14:13 Uhr
0xdeadbeef
Gott
(Operator)


Dass der Watcom-Compiler die Mathe-Bibliothek mit

C++:
#include <math>


nicht einbindet, wird daran liegen, dass der betreffende Header <cmath> heißt.

Zu Borland-Make kann ich leider nicht viel sagen. Wenn es POSIX-konform ist, kommen mir deine zwei ersten Regeln aber äußerst suspekt vor - Wildcards in Zielen und Abhängigkeiten? Selbst wenn das shell-mäßig aufgelöst wird, sind vor der Kompilation keine APC_*.obj-Dateien vorhanden.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.04.2011, 00:44 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von 0xdeadbeef:
Dass der Watcom-Compiler die Mathe-Bibliothek mit

C++:
#include <math>


nicht einbindet, wird daran liegen, dass der betreffende Header <cmath> heißt.

Ups! - Tippfehler meinerseits. Da steht auch #include <cmath>


Zitat:
Zu Borland-Make kann ich leider nicht viel sagen. Wenn es POSIX-konform ist, kommen mir deine zwei ersten Regeln aber äußerst suspekt vor - Wildcards in Zielen und Abhängigkeiten? Selbst wenn das shell-mäßig aufgelöst wird, sind vor der Kompilation keine APC_*.obj-Dateien vorhanden.

Naja, dann hab ich wohl irgendwas beim Aufbau von makedateien noch nicht verstanden.
Es handelt sich um insgesamt 27 Dateien (13 C++ Code- und 14 Header Dateien) deren Namen allesamt mit "APC_" anfangen, die zusammen eine statische Bibliothek mit Namen "APC_lib.lib" ergeben sollen.

Und so, wie ich die makedateien bisher verstehe, stehen die Anweisungen darin in umgekehrter Reihenfolge ihrer Ausführung. Es gibt eine Standardmakedatei, die so aussieht:

Zitat:


Code:
#
# Inprise C++Builder - (C) Copyright 1999 by Borland International
#

CC       = bcc32
RC       = brcc32
AS       = tasm32

!if $d(__NMAKE__)
CXX      = bcc32 -P
CPP      = bcc32 -P
!endif

.asm.obj:
      $(AS) $(AFLAGS) $&.asm

.c.exe:
      $(CC) $(CFLAGS) $&.c

.c.obj:
      $(CC) $(CFLAGS) /c $&.c

.cpp.exe:
      $(CC) $(CFLAGS) $&.cpp

.cpp.obj:
      $(CC) $(CPPFLAGS) /c $&.cpp

.rc.res:
      $(RC) $(RFLAGS) /r $&

.SUFFIXES: .exe .obj .asm .c .res .rc

!if !$d(BCEXAMPLEDIR)
BCEXAMPLEDIR = $(MAKEDIR)\..\EXAMPLES
!endif



Die wird automatisch benutzt, wenn keine andere angegeben wurde.
Nur fehlt darin ein Linkeraufruf, weil der Compiler sich anscheinend selber darum kümmert, den Linker aufzurufen. Eine Erläuterung dazu hab ich jedenfalls noch nicht gefunden.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.04.2011, 18:32 Uhr
0xdeadbeef
Gott
(Operator)


Der Aufbau einer make-Datei gestaltet sich im Wesentlichen so:

Code:
ziel: abhängigkeiten
        anweisungen


Beispiel (mit UNIX-Konventionen):

Code:
programm: programm.o util.o
        cc -o programm programm.o util.o

programm.o: programm.c
        cc -c programm.c

util.o: util.c
        cc -c util.c


Wenn du jetzt "make programm" sagst, liest make die Regel für programm, stellt fest, dass programm die Abhängigkeiten programm.o und util.o hat, sucht die Regeln für diese beiden und fährt auf die gleiche Weise fort. Sobald alle Abhängigkeiten für eine Regel erfüllt sind, werden ihre Anweisungen ausgeführt.

Bei großen Anwendungen wäre es natürlich ziemlich umständlich, für jedes Modul eine eigene Regel aufzuschreiben, deswegen gibt es Sonderformen. Eine davon hast du in deinem Beispiel häufig - eine Regel der Form

Code:
.ext1.ext2:


legt fest, wie aus einer Datei mit der Endung .ext1 in eine Datei mit der Endung .ext2 erstellt werden kann. Etwa kann man das obrigen Beispiel so schreiben:

Code:
programm: programm.o util.o
        cc -o programm programm.o util.o

.c.o:
        cc -c $<


hierbei ist $< eine spezielle Variable, die die erste Abhängigkeit der Regel enthält. Es gibt davon noch weitere; die üblichsten sind wohl $@ (Ziel der Regel) und $+ (alle Abhängigkeiten). So schrumpft sich das ganze weiter zusammen als

Code:
programm: programm.o util.o
        cc -o $@ $+

.c.o:
        cc -c $<


Außerdem hat make in der Regel für die üblichsten Umwandlungen implizite Regeln, so dass man sich davon auch den größten Teil sparen kann. Es ist gut möglich, dass man mit

Code:
programm: programm.o util.o
        cc -o $@ $+


davonkommt.

Ich lasse noch diesen Link hier: www.eng.hawaii.edu/Tutor/Make/ - das ist ein ganz guter Einstieg. Inwieweit sich das alles 1:1 auf Borlands make übertragen lässt, kann ich aber nicht sagen - nmake und GNU make sind nicht 100% kompatibel, und es gibt zwar einen Standard, aber man kann sich bei proprietärer Software nicht immer darauf verlassen, dass sie sich auch daran hält. Gerade, wo Borland 5.5 schon etwas älter ist. Es gibt doch bestimmt ein Handbuch dazu, oder?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 28.04.2011 um 18:36 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.05.2011, 01:57 Uhr
Hans
Library Walker
(Operator)


Hi,

erst mal danke für die ausführliche Erläuterung. Das hat schon ein Stück weiter geholfen. Mein weiteres Problem war neben der make-datei aber auch die Frage, wie ich den Linker dazu veranlasse, eine statische Bilbliothek (*.lib) zu erstellen. Die Antwort hab ich mittlerweile selber gefunden. Sie lautet: gar nicht. Um diese Bibliotheken zu erstellen gibt es das Kommandozeilentool TLIB, das für die Erstellung dieser Bibliotheken gedacht ist. Es baut sie aus den Objektdateien zusammen, die der Compiler erzeugt hat. - Der Linker hat damit nichts zu schaffen, er benutzt später nur die fertige Bibliothek.

Nebenbei hab ich festgestellt, das es in der GUI des C++ Builder, Version 1.0 gar nicht vorgesehen war, *.LIB Dateien zu erstellen. Ob das in späteren Versionen geändert wurde, weis ich nicht, weil ich die nicht habe. Mit der 1.0er Version geht das jedenfalls nur über die Kommandozeile.

Wäre zum schluss noch anzumerken, das ich in der Uni-Bibliothek noch dieses aufschlussreiche Buch aufgestöbert habe. Ist zwar schon etwas älter, aber grundsätzlich noch zu gebrauchen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


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: