C Anfängerfrage: Auf Variablen aus externer Datei zugreifen

Photon

Rear Admiral Pro
🎅 Nikolaus-Rätsel-Elite
Registriert
Apr. 2006
Beiträge
5.204
Hallo Community,

ich versuche gerade ein kleines Programm mittels gettext übersetzbar zu machen und stoße auf folgendes Problem:

Code:
lstrings.c:31:19: error: initializer element is not constant
   31 | #define _(STRING) gettext(STRING)
      |                   ^~~~~~~
lstrings.c:302:35: note: in expansion of macro '_'
  302 | const char *STR_MSG_Importing_object  = _("LOADING OBJECT . . .");

Vielleicht kann ja jemand direkt etwas mit dieser Fehlermeldung in dem Kontext anfangen, in dem Fall ist der Rest des Posts hinfällig, ansonsten bin ich gerade dabei ein Minimalbeispiel zu basteln und scheitere schon an den Basics. Die Dateienstruktur sieht vereinfacht so aus:

C:
// lstrings.h

extern const char *message;
...

C:
// lstrings.c

#include "mainprog.h"

const char *message = "Bla";
...

C:
// mainprog.h

#include "lstrings.h"

...

C:
// mainprog.c

#include "mainprog.h"
...
printf( "%s\n", message );
...

Es gibt noch viele andere Dateien, aber das sind die meiner Einschätzung nach relevanten. Kompiliert wird das Ganze mittels eines Makefiles, aber ich weiß nicht, welche Compiler-Befehle da konkret ausgeführt werden. In dem Zustand (also ohne Hinzufügen von gettext) wird das auch ohne Fehler kompiliert.

Nun versuche ich dasselbe als Minimalbeispiel nachzubauen sieht dann sehr analog aus:

C:
// hello.h

extern const char *message;


// hello.c

#include "main.h"

const char *message    = "Hello World!";


// main.h

#include <stdio.h>
#include <stdlib.h>


// main.c

#include "main.h"

int main()
{
  printf("%s", message);

  return EXIT_SUCCESS;
}

Und beim Versuch das zu kompilieren passiert Folgendes:

Code:
$ gcc -c hello.c -o hello.o
$ gcc -c main.c -o main.o
main.c: In Funktion »main«:
main.c:5:16: Fehler: »message« nicht deklariert (erste Verwendung in dieser Funktion)
    5 |   printf("%s", message);
      |                ^~~~~~~
main.c:5:16: Anmerkung: jeder nicht deklarierte Bezeichner wird nur einmal für jede Funktion, in der er vorkommt, gemeldet

Mit dem Linken fang ich gar nicht erst an, da ja die Kompilation von main.c schon fehlschlägt. Und eigentlich macht es auch sehr viel Sinn, dass sie fehlschlägt, denn weder in der main.c noch in der main.h ist irgendein Verweis auf die hello.c, in der die Variable message definiert wird. Aber genau derselbe Aufbau funktioniert aus irgendeinem Grund in dem ursprünglichen größeren Programm...

Wahrscheinlich muss der Compiler-Befehl irgendwie anders aussehen, ich tu mich aber schwer zu ergoogeln wie, hat vielleicht jemand einen Tipp?

Vielen Dank!
Photon
 
Zuletzt bearbeitet:
In der mainprog.h

wird
#include "lstrings.h"

inkludiert.

In deiner main.h fehlt hingegen
#include "hello.h"
 
  • Gefällt mir
Reaktionen: netzgestaltung
Zurück
Oben