Seite 1 von 1

Einstiegspunkt main() ändern?

Verfasst: Do Nov 14, 2013 4:27 pm
von cui
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 the ENTRY point 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**)'"

Re: Einstiegspunkt main() ändern?

Verfasst: Do Nov 14, 2013 8:14 pm
von Xin
Moin Cui,

2 Stunden war keine kreativ, tsts... ^^
cui hat geschrieben: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.
Hmm.... ich denke doch... vielleicht machst Du Dir die Sache auch zu schwer.
cui hat geschrieben: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.
Das geht nicht - in einer Library kann/darf kein main()-Programm stecken. Dann hat jemand beim Aufbau der Library einen Fehler gemacht.

Lädst du die Library als SharedObject/DLL oder linkst Du sie statisch dazu? Darf man erfahren, um welche Lib es sich handelt? Irgendwas von Qt oder etwas selbst gestricktes?
cui hat geschrieben: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 the ENTRY point 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**)'"
Klingt als hätte Qt hier auch schon eingegriffen? ^^

Ansonsten verstehe ich nicht, wieso er qMain() nicht findet.

Oder um es mit Nr. 5s Worten zu sagen: "Brauche mehr Input!" ^^

Re: Einstiegspunkt main() ändern?

Verfasst: Fr Nov 15, 2013 8:32 am
von cui
Moin,
vielen Dank für eine Antwort.

Die Library ist schon richtig so wie sie ist, klingt doof das da eine main() drin ist, aber es ist wie es ist. Daran kann ich nix ändern, da rüttelt auch kein "kann/darf kein main() stecken" das interessiert leider keinen. Ich bin wegen diesem Hinweis nicht verägert oder so, will nur sagen das ich an diesem Zustand nix ändern kann, auch wenn ich es gern machen würde.
Xin hat geschrieben:Lädst du die Library als SharedObject/DLL oder linkst Du sie statisch dazu? Darf man erfahren, um welche Lib es sich handelt? Irgendwas von Qt oder etwas selbst gestricktes?
Ich linke sie statisch dazu. Es ist keine Qt-Eigene Lib, es ist etwas selbst getricktes. Es wurde aus dem C Programm eines Controllers eine lib mit Hilfe von Qt erstellt, deswegen ist auch ein main() drin. Funktionieren tut diese auch. Das weiß ich, weil ich mal die main() darin umbenannt hab um zu sehen ob der Fehler auch daran liegt.
Xin hat geschrieben:Klingt als hätte Qt hier auch schon eingegriffen? ^^
Ansonsten verstehe ich nicht, wieso er qMain() nicht findet.
Den Fehler bekomme ich auch, wenn ich den Eintrag
-ENTRY,new_main
weg lasse. Bin mir auch nicht sicher ob ich den richtig eingegeben habe, oder an der falschen Stelle. Ausschließen will ich das nicht. In Qt bin ich wirklich Neuling. Den Eintrag nahm ich hier vor:
"Extras/Einstellungen/Erstellung und Ausführung/Compiler" im Bereich platformspezifische Linkerschalter
Xin hat geschrieben:Oder um es mit Nr. 5s Worten zu sagen: "Brauche mehr Input!" ^^
und er lebt noch, der gute alte Nr.5 ;) nun muss ich nur noch wissen was Nr.5 für Inputs brauch :D

Re: Einstiegspunkt main() ändern?

Verfasst: Fr Nov 15, 2013 9:15 am
von cloidnerux
Um die Sachlage nochmal zu verstehen:
Du hast aus einem alten Programm, für das du keinen Sourcecode hast, irgendwie eine Lib gebastelt, die du linken kannst. Nun hast du aber eine Main-Funktion in deiner Lib und eine in deinem Programm, aber die main-Funktion in deiner Lib muss der eigentliche Startpunkt sein oder die main in deinem eigenen Programm?

Re: Einstiegspunkt main() ändern?

Verfasst: Fr Nov 15, 2013 10:05 am
von cui
cloidnerux hat geschrieben:Um die Sachlage nochmal zu verstehen:
Du hast aus einem alten Programm, für das du keinen Sourcecode hast, irgendwie eine Lib gebastelt, die du linken kannst. Nun hast du aber eine Main-Funktion in deiner Lib und eine in deinem Programm, aber die main-Funktion in deiner Lib muss der eigentliche Startpunkt sein oder die main in deinem eigenen Programm?
- ich habe den Sourcecode von dem Controller Programm (den Code darf nicht verändert werden, also dort nicht einfach main() in new_main() ändern)
- dieser Sourcecode ging in eine Lib
- der richtige Startpunkt ist der in dem eigenen Programm welches auf die Lib zugreift

Re: Einstiegspunkt main() ändern?

Verfasst: Fr Nov 15, 2013 10:13 am
von Xin
cui hat geschrieben:Die Library ist schon richtig so wie sie ist, klingt doof das da eine main() drin ist, aber es ist wie es ist. Daran kann ich nix ändern, da rüttelt auch kein "kann/darf kein main() stecken" das interessiert leider keinen. Ich bin wegen diesem Hinweis nicht verägert oder so, will nur sagen das ich an diesem Zustand nix ändern kann, auch wenn ich es gern machen würde.
Ich kenne Dein Umfeld nicht, aber Du schreibst, es handelt sich um etwas selbst Gestricktes.
Ergo kannst Du etwas tun, da Du das Projekt ja selbst kompilierst, bzw. demjenigen auf die Füße treten kannst, der die Lib erzeugt.
Diese Person macht einen Fehler, der Dich in Deinem Job behindert und der grundsätzlich falsch ist.
cui hat geschrieben:
Xin hat geschrieben:Lädst du die Library als SharedObject/DLL oder linkst Du sie statisch dazu? Darf man erfahren, um welche Lib es sich handelt? Irgendwas von Qt oder etwas selbst gestricktes?
Ich linke sie statisch dazu. Es ist keine Qt-Eigene Lib, es ist etwas selbst getricktes.
Dachte ich mir. Ein main() hat in einer lib nichts zu suchen und auch wenn ich mir Ausnahmen vorstellen könnte, so wären das weniger Libs als das Hauptprogramm, welches Du in Form einer Lib erweitern bzw. vervollständigen würdest.
cui hat geschrieben:Es wurde aus dem C Programm eines Controllers eine lib mit Hilfe von Qt erstellt, deswegen ist auch ein main() drin.
Dieses main() muss da raus. Alles andere ist nur Gefrickel.
cui hat geschrieben:Funktionieren tut diese auch. Das weiß ich, weil ich mal die main() darin umbenannt hab um zu sehen ob der Fehler auch daran liegt.
Womit Du klargestellst hast, dass Du auch ändern kannst.

In der Lib wirst Du main() wohl kaum benötigen, oder? Alleine das sollte Dir als Hinweis reichen, dass die Funktion an dieser Stelle vollkommen fehlplatziert ist.
Kompiliere die Lib mit dem Define THIS_IS_A_LIB (oder irgendwas anderem) und frage im Quelltext ab:

Code: Alles auswählen

#if not defined THIS_IS_A_LIB
int main( int argc, char ** argv )
{
  /* Die main-Routine, die für das Programm zuständig ist */
}
#endif
Da main() in der Lib sowieso nicht gebraucht wird, wird das Programm für das Tool unverändert kompiliert. Kompilierst Du Deine Lib, wird main() nicht mitkompiliert.

Der richtige Weg wäre main() komplett aus der Lib zu entfernen, ausschließlich nur noch die lib zu bauen und main (und alle nur vom Tool benötigten Dinge) auszulagern. Anschließend baust Du Dein Tool und linkst die Lib statisch dazu, um das Executable zu erhalten.

Vollständigkeitshalber gibt es mit Hilfe des Linker-Schalters -e die Möglichkeit den Entry festzulegen. Was ich beim Überfliegen gefunden habe, ist dass -e wohl auch den Standard-Startcode ersetzt. Es gibt dann auch kein argc und argv mehr, denn die werden vom Startcode erzeugt. In Kombination mit dem strip-(bash?)-Befehl lassen sich die Libs dann verändern. Eventuell/Wahrscheinlich? aber nicht unter Windows - so genau habe ich mich da gestern nicht reingefuchst.

Es ist nicht sinnvoll, um Designfehler herumzufrickeln. Korrigiere den Fehler in eurer Software-Architektur!

cui hat geschrieben:- ich habe den Sourcecode von dem Controller Programm (den Code darf nicht verändert werden, also dort nicht einfach main() in new_main() ändern)
Lösung zwei ("Der richtige Weg") erlaubt Dir den Code unverändert zu lassen. Du baust die Lib ohne main und linkst main in einem zweiten Schritt hinzu. Das Tool ist damit unverändert und main verschwindet aus der Lib.

Re: Einstiegspunkt main() ändern?

Verfasst: Fr Nov 15, 2013 9:55 pm
von cui
Moin

hier einmal wie es nun gelöst wurde.

Das main() in der Lib wurde nun doch noch durch den pragma Eintrag "#pragma redefine_extname" umbenannt. Und im Endeffekt passierte somit das was alle schon geraten haben.

Ich danke euch um Eure Bemühungen mir zu helfen und hoffe das ich bei Gelegenheit mal wieder vorbeischauen kann.

Re: Einstiegspunkt main() ändern?

Verfasst: Fr Nov 15, 2013 10:14 pm
von Xin
cui hat geschrieben:Das main() in der Lib wurde nun doch noch durch den pragma Eintrag "#pragma redefine_extname" umbenannt. Und im Endeffekt passierte somit das was alle schon geraten haben.
#pragma ist immer so eine Sache... es ist nicht standardisiert.

Aber wenn es euer Problem löst, ist das Problem erstmal gelöst und mit etwas Glück taucht es nicht wieder auf.
cui hat geschrieben:Ich danke euch um Eure Bemühungen mir zu helfen und hoffe das ich bei Gelegenheit mal wieder vorbeischauen kann.
Ich habe nicht vor den Server abzuschalten - also an uns wird's nicht liegen :->