Einstiegspunkt main() ändern?

OP #3403342
Lesenswert?
• ▲
▼
Hallo,

ich habe eine eher ungewöhnliche Frage, wie kann ich den Einsteigspunkt 
von main() in zum Beispiel new_main() ändern? Ich weiß man sollte sich 
an Vorgaben halten, aber hier geht es nicht anders.

Meine Entwicklungsumgebung ist Qt Creator mit MinGW.

In der will ich eine Qt-Gui-Anwendung generieren will. Mit der Gui will 
ich auf eine library zugreifen in der ein Controller-Programm steckt auf 
das ich zugreifen will. Und in dieser steckt schon eine main() die ich 
auch nicht entfernen will und darf.

Für Visual Studio hab ich den Eintrag "/ENTRY" unter 
Einstellungen/Linker gefunden. Da funktioniert es auch. Jedenfalls in 
einer Win32 Console.
Für Qt Creator bekomme ich es nicht hin. Für den GCC gibt es zwar 
ebenfalls einen ENTRY Eintrag 
"http://sca.uwaterloo.ca/coldfire/gcc-doc/docs/ld_24.html"; aber wenn ich 
im Creator unter "Extras/Einstellungen/Erstellung und 
Ausführung/Compiler" platformspezifische Linkerschalter setze wie zum 
Beispiel "-ENTRY,new_main" bekomme ich immer eine Fehlermeldung 
"Fehler:undefined reference to `qMain(int, char**)'"
OP #3403402
Lesenswert?
• ▲
▼
Hi Chris,

danke für die Info.

also in etwa so?
1
C:\Qt\Qt5.1.1\Tools\mingw48_32\bin>gcc -Dmain=new_main -o world.exe hello.c
da hab ich wohl was falsch eingegeben?

denn es gibt folgende Rückmeldung:
1
c:/qt/qt5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_li
2
bmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined reference to `WinMain@16'
3
collect2.exe: error: ld returned 1 exit status
OP #3403644
Lesenswert?
• ▲
▼
OK hab es nochmal ausprobiert mit unten stehenden Code und bekomme 
leider immer noch Fehlermeldungen. Hat noch jemand Ideen was falsch 
läuft?

1
gcc -Dmain=new_main -o world.exe hello.c

Fehlermeldung:
1
hello.c:10:5: error: redefinition of 'new_main'
2
 int new_main(void)
3
     ^
4
<command-line>:0:6: note: previous definition of 'new_main' was here
5
hello.c:3:5: note: in expansion of macro 'main'
6
 int main(void) 
7
     ^

C-Code
1
#include "stdio.h"
2
 
3
int main(void)
4
{
5
  printf("Hello World!\n");
6
 
7
  return 0;
8
}
9

10
int new_main(void)
11
{
12
  printf("Hello new_main World!\n");
13
 
14
  return 0;
15
}
#3403650
Lesenswert?
• ▲
▼
Das "-Dmain=new_main" nützt dir rein gar nichts in Bezug auf "anderer 
Einstiegspunkt". Es macht lediglich eine Textersetzung im Sourcecode, 
weshalb du mit obigen Code Fehlermeldungen bekommst, die nichts weiter 
sagen, als:
"du hast zwei Funktionen mit dem selben Namen (new_main)"
Gast #3403662
Lesenswert?
• ▲
▼
dieses -Dmain=new_main
ist daselbe als
#define main new_main

Du hattest berichtet, dass du eine Lib hàttest, in der es eine Main
bereits gibt, und es dann Linkerprobleme gibt.
Wenn diese Lib dann deine new_main aufruft, passt es. Dazu musst du
halt auch gefàllig diese Lib dazulinken, sonst wird es nichts.

Ne andere Sache ist, wenn deine Analyse des Sachverhalts mit der Lib und
main nicht zutreffend ist. Niemand ausser Dir wird dies eròrtern kònnen.
OP #3403697
Lesenswert?
• ▲
▼
die Lib kann ich nicht verändern, die wird weiterhin ihre main() 
Funktion behalten. Ist leider so, ich würde sie auch am liebsten ändern.

Mir bleibt somit leider keine andere Option als in dem Programm das die 
Lib aufruft den Einstiegspunkt main() in ein new_main() oder ähnliches 
zu ändern. Deswegen dachte ich auch an den ENTRY-Eintrag. Nur nimmt der 
GCC den nicht an, oder ich gebe den falsch an.

Bisher sagte mir auch jeder das es geht, nur keiner weiß genau wie.
OP #3403704
Lesenswert?
• ▲
▼
Simon F. schrieb:
> Vielleicht kannst du per Linker Skript eine eigene crt0 linken. Diese
> könnte eine Kopie der originalen crt0 sein, welche dann aber nicht
> main() anspringt.
> Wenn das für reine PC Programmierung nicht zu Umständlich ist...
>
> Simon


klingt schon gut, aber wie macht man das? Gibt es 
Anleitungen/Beschreibungen im Netz dazu?
Gast #3403707
Lesenswert?
• ▲
▼
Das Ganze ist nicht wirklich übel kompliziert aber eben auch nicht 
trivial.
Es geht schon, aber...

>Bisher sagte mir auch jeder das es geht, nur keiner weiß genau wie.

... dazu fehlen uns die Informationen und Dir die Erfahrung.
Einen von beiden Wegen wirst Du gehen müssen.

Schreibe doch mal wieviele Jahre Erfahrung Du hast und deute mal so die 
drei grössten Projeke an, die Du gemacht hast. Dann könnte man mal einen 
Tip geben ob es Sinn hat das Du das weiter versuchst oder ob Du Dir 
Hilfe suchen solltest.
Gast #3403715
Lesenswert?
• ▲
▼
die Lib ist aber nicht qmain.lib welche du linkst ?
die implementiert nàhmlich _main und anstelle von main aufzurufen wird
dann qMain aufgerufen. Wenn dem so wàre, einfach deine main in qMain
umàndern, oder eben -Dmain=qMain beim gcc schreiben, aber nicht 
vergessen,
qmain.lib auch beim gcc anzugeben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren