OpenBSD boehm-gc include'n

mogbo

Banned
Hallo,
hab in einem anderen Thread von boehm-gc gelesen ( @Yamagi ), nun hab ichs geladen und via pkg_add installiert.

/usr/local/include/gc.h
Inhalt:
Code:
/* This file is installed for backward compatibility. */
#include <gc/gc.h>

Und das "richtige" gc.h ist in /usr/local/include/gc/gc.h

Hier ein Ausschnitt aus der Manpage:
Code:
SYNOPSIS
       #include "gc.h"
       void * GC_malloc(size_t size);
       void GC_free(void *ptr);
       void * GC_realloc(void *ptr, size_t size);

       cc ... gc.a


Die Frage ist wiedermal ziemlich dämlich, aber ich komme nicht wirklich weiter... wie include ich das Teil?

#include <gc.h>
#include "gc.h>
#include <gc/gc.h>
#include "gc/gc.h"

Alles nicht funktioniert :)
 
Nummer 3 sollte stimmen. Aber -I/usr/local/include musst Du ihm schon mitgeben. Nur /usr/include wird impliziert.
 
Code:
make test14
cc -O2 -pipe    -o test14 test14.c
test14.c:9:10: fatal error: '/gc/gc.h' file not found
#include </gc/gc.h>
         ^~~~~~~~~~
1 error generated.
*** Error 1 in /home/sinus/c_code (<sys.mk>:85 'test14')

mit
Code:
#include </usr/local/include/gc/gc.h>
scheints zu funktionieren
 
Der Schrägstrich am Anfang gehört da ja auch nicht hin.
 
Der Schrägstrich am Anfang gehört da ja auch nicht hin.
Lustigerweise doch :)
Ohne den Schrägstrich sucht er in /usr/include/usr/local/include/gc/gc.h .

EDIT:
Achso, du meinst das #include </gc/gc.h>

Im Endeffekt ists so und so nicht im include Pfad und ich muss mit einem ganzen Pfad include'n oder den Pfad irgendwie erweitern


#include </usr/local/include/gc/gc.h>
Ist aufjedenfall ein Lösungsweg, ich schau mal ob ich /usr/local/include irgendwie zum include-Pfad dazunehmen kann (vermutlich mit der make.conf oder so)
 
Es geht zwar ist aber so nicht gedacht. Includes in <> binden Systemheader ein. Du definierst welchen Header du einbinden willst (nicht den Pfad dahin). Mit "" bindest du direkt Header ein, i.A. die du lokal in deinem Projekt liegen hast (und gibst sie daher iA mit relativem Pfad an).
Deinem Compiler übergibst du nun noch den Pfad deiner Systemheader und schon funktioniert alles (und vor allem lässt sich überall übersetzen wo die Systemheader vorhanden sind [egal wo das im jeweiligen System nun genau sein mag]).
 
Der Sinn dahinter erschließt sich vielleicht etwas besser wenn man größer denkt. Solange man nur eine oder zwei Source-Dateien hat, die auch nur auf einem System gebaut werden, macht es keinen großen Unterschied ob man "" oder <> nutzt. Außer natürlich, dass man sich an die Konventionen hält. Wenn man aber deutlich mehr Source-Dateien hat, im Extremfall auch mal ein paar hundert davon, die dann auch noch auf verschiedenen Systemen von Linux über OpenBSD bis Windows gebaut werden sollen, ist man schnell bei Build-Systemen wie cmake. Die ermitteln dann automatisch, wo die benötigen Systemheader liegen, generieren daraus die Suchpfade für den Compiler und übergeben diese per -I (Includes) und -L (Bibliotheken). Dadurch kannst du stumpf '#include <gc/gc.h> schreiben und der Header wird gefunden, egal wo exakt er im System liegt. Schreibst du aber '#include "/usr/local/include/gc/gc.h" musst du für jedes System dienen Code an die jeweiligen Pfade anpassen.
 
Systemheader finde ich in dem Kontext ziemlich problematisch benannt, die haben nix mit dem System zu tun. Es sind global bekannte Header-Dateien im Gegensatz zu den lokalen relativen. Installiert man eine externe Bibliothek über das Paketsystem werden die in den gängigen Orten abgelegt.
 
Ja, stimmt. "Globale Header" ist definitiv der bessere Begriff.
 
Zurück
Oben