Forum: PC-Programmierung Einstiegspunkt main() ändern?


von rizzo r. (rizzo)


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**)'"

von chris (Gast)


Lesenswert?

Was hälst du von folgendem dem Compiler mitzugeben?
-Dmain=new_main

von rizzo r. (rizzo)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

rizzo rat schrieb:
> 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.

In der Library ist eine Funktion namens main enthalten? Wirklich?

Das ist ... kaputt.

von chris (Gast)


Lesenswert?

Du hast vergessen deine Lib, welche die main Funktion enthält, mit 
anzugeben.
Deshalb kommt ja die Fehlermeldung, daß es main nicht findet.

von rizzo rat (Gast)


Lesenswert?

Also muss mit -Dmain trotzdem eine Main existieren? Nur ist die dann 
nicht mehr der Einstiegspunkt?
Das Programm oben war nur eine Testapplikation mit einer new_main

von rizzo r. (rizzo)


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
}

von Stefan E. (sternst)


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)"

von Simon F. (bogo)


Lesenswert?

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

von chris (Gast)


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.

von rizzo r. (rizzo)


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.

von rizzo r. (rizzo)


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?

von Hululu (Gast)


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.

von Hululu (Gast)


Lesenswert?

Abgesehen davon, deuten Libraries, die eine Funktion namens main 
enthalten schon auf Laien-Pfuscherei hin.

von chris (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.