Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

15.12.2008, 15:42

[g++ / Codeblocks] Gegen ein Konsolenprojekt linken?

Vorab: Ich arbeite mit C::B als IDE, nicht mit makefiles.

Das Problem (Turboversion):
Wie kann ich den gcc dazu zwingen, eine Import Library für mein Konsolenprogramm zu erstellen? Ich will eine andere Library gegen eben jenes Konsolenprogramm linken.

Das Problem (Ausführlich):
Meine Serveranwendung ist ein Konsolenprogramm und lädt Plugins. Da Plugins auch in gewissem Umfang Funktionalitäten des Servers gebrauchen können / müssen, muss ich diese beim Kompilieren gegen den Server linken. Der allgemeine Ansatz ist bisher der "übliche" Weg über ein #define zur Unterscheidung zwischen __declspec(dllimport) und (dllexport).

Das ist mein momentaner Ansatz:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# // Are we building the server?

# if defined(WORD_NONCLIENT_BUILD)
#   // Exporting with gcc

#   if COMPILER == COMPILER_GNUC
#       define _WoRDExport  __attribute__ ((dllexport)))
#       define _WoRDPrivate __attribute__ ((visibility("hidden")))
#   // Exporting with msvc

#   else
#       define _WoRDExport __declspec(dllexport)
#       define _WoRDPrivate
#   endif
# // Or are we linking against it?

# else
#   // Linking with gcc

#   if COMPILER == COMPILER_GCC
#       define _WoRDExport __attribute__ ((dllimport)))
#       define _WoRDPrivate
#   // Linking with msvc

#   else
#       define _WoRDExport __declspec(dllimport)
#       define _WoRDPrivate
#   endif
# endif
Das ganze ist ein Gemisch aus Googlenachforschungen, Spicken in "offenen" Projekten und Chats. dllimport bzw dllexport scheint für den gcc (je nach Quelle) mal sauber zu sein und mal nicht. Wichtig ist erstmal nur, dass der gcc 4 auf den ich Zugriff habe das frisst.

Mit dem MSVC++ geht das wunderbar, leider muss ich das ganze auch noch dem gcc verkaufen :( Im Gegensatz zum MSVC++ erstellt dieser beim linken nämlich keine Dateien um andere Dateien dagegen zu linken, der MSVC++ erstellt brav eine .lib. Ich hatte ja gehofft dass die "__attribute__ ((dllexport)))" beim gcc ein ähnliches verhalten zu Tage fördern würde, ist aber nicht so.

Das ganze scheint daran zu liegen, dass das Projekt (in C::B) als Konsolenprojekt erstellt wird. Dadurch wird nämlich die "Create Import Library" Checkbox in den Prokektoptionen ausgegraut. Und eine solche brauche ich ja.

Hat hier jemand eine Idee wie ich C::B (oder von mir aus auch per Kommandozeilenoption den gcc) dazu überreden kann, mir eine solche Import Library zu erstellen?

Was ich schon versucht habe:
gcc linker Parameter:
[list]-shared bewirkt (soweit ich das sehe) einfach garnix. Vermutlich weil C::B das Projekt für die Konsole erstellt und der Parameter dadurch irgendwie nicht zum Zuge kommt.
-rdynamic macht nicht das, was ich brauche.[/list]

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

2

15.12.2008, 17:50

also wenn ich bei mir in C::B auf "new project" gehe kann ich in dem fenster "dynamic link library" auswählen... versuch das mal anstelle einer "console application".

ps: ich hab C::B 8.02

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

15.12.2008, 17:57

Das wäre meine Notlösung. Aber genau die will ich ja vermeiden :(

Müsste ich halt den Server als SharedObject kompilieren und dann über eine "Alibi Exe" ausführen. So richtig elegant finde ich das aber nicht :x

Edit: Und das Target im Nachhinein zu ändern wäre bei C::B zum Glück auch kein Problem. Ich müsste also immerhin kein neues Projekt erstellen (dem Himmel sei Dank, was da alles drinsteckt ...).

Werbeanzeige