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**)'"
Was hälst du von folgendem dem Compiler mitzugeben? -Dmain=new_main
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 |
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.
Du hast vergessen deine Lib, welche die main Funktion enthält, mit anzugeben. Deshalb kommt ja die Fehlermeldung, daß es main nicht findet.
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
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 | }
|
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)"
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
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.
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.
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?
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.
Abgesehen davon, deuten Libraries, die eine Funktion namens main enthalten schon auf Laien-Pfuscherei hin.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.