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]