Was bedeutet /FORCE:MULTIPLE



  • Hallo

    Ich habe mir gestern eine Bibliothek namens wykobi runtergeladen und nach einigen Startprobleme, die schon in einem anderen Thread besprochen wurden, hatte ich am Ende nur noch solche Linkerfehler:

    MyGeometrie.obj : error LNK2005: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrie.obj : error LNK2005: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrie.obj : error LNK2005: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrieDoc.obj : error LNK2005: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrieDoc.obj : error LNK2005: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrieDoc.obj : error LNK2005: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrieView.obj : error LNK2005: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrieView.obj : error LNK2005: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj
    MyGeometrieView.obj : error LNK2005: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj
    Point.obj : error LNK2005: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj
    Point.obj : error LNK2005: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj
    Point.obj : error LNK2005: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj
    Triangel.obj : error LNK2005: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj
    Triangel.obj : error LNK2005: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj
    Triangel.obj : error LNK2005: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj
    fatal error LNK1169: one or more multiply defined symbols found

    Zu der Bibliothek gehören aber kein lib oder dllD-Dateien, sondern nur Header und inline Dateien. Ich ahbe diese alle in den gleichen Ordner entpackt und diesen Ordner VS05 bekannt gemacht. Dann habe ich einfach wykobi.hpp inkludiert und es folgen diese Fehler. Der Hersteller meinte dazu, dass ich es mit folgender Linkeroption (/FORCE:MULTIPLE) zu probieren. Damit kompiliert das Programm aber es folgen Warnungen:

    Warning 1 warning LNK4075: ignoring '/INCREMENTAL' due to '/FORCE' specification MyGeometrie
    Warning 2 warning LNK4006: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrie.obj
    Warning 3 warning LNK4006: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrie.obj
    Warning 4 warning LNK4006: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrie.obj
    Warning 5 warning LNK4006: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrieDoc.obj
    Warning 6 warning LNK4006: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrieDoc.obj
    Warning 7 warning LNK4006: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrieDoc.obj
    Warning 8 warning LNK4006: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrieView.obj
    Warning 9 warning LNK4006: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrieView.obj
    Warning 10 warning LNK4006: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored MyGeometrieView.obj
    Warning 11 warning LNK4006: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored Point.obj
    Warning 12 warning LNK4006: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored Point.obj
    Warning 13 warning LNK4006: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored Point.obj
    Warning 14 warning LNK4006: "double * wykobi::sin_table" (?sin_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored Triangel.obj
    Warning 15 warning LNK4006: "double * wykobi::cos_table" (?cos_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored Triangel.obj
    Warning 16 warning LNK4006: "double * wykobi::tan_table" (?tan_table@wykobi@@3PANA) already defined in Line.obj; second definition ignored Triangel.obj
    Warning 17 warning LNK4088: image being generated due to /FORCE option; image may not run

    Jetzt habe ich mehrer Fragen: Was bedeute diese Warnungen genau? Was bewirkt /FORCE:MULTIPLE? Gibt es eine Möglichkeit das Problem eleganter zu lösen?

    Vielen Dank

    chrische



  • http://msdn2.microsoft.com/en-us/library/70abkas3(vs.80).aspx

    sin_,cos_ und tan_table sind anscheinend mehrfach definiert und mit dem /FORCE wird einfach die 1. Definition genommen.



  • Hallo

    Gibt es andere Möglichkeit die Fehler zu verhindern? Diese Linkerfehler machen mich wirklich immer fertig. 🙂

    Line und Point sind Klassen von mir.

    chrische



  • Du mußt (und darfst) die Funktionsdefinitionen nur einmal in deinem Projekt eingebunden haben, sonst beschwert sich der Linker. Das bedeutet, daß du nur die Header einbinden mußt und die dazugehörige .CPP "nur" in dein Projekt einbinden mußt (damit sie mit compiliert wird, wenn du das Programm erstellst).



  • Hallo

    Da gibt es keine cpp-Dateien, sondern nur inline-Dateien, die sich im selben, der IDE bekannten, Ordner befinden. Ich habe keine Datei des Projekt hinzugefügt.

    chrische



  • chrische5 schrieb:

    Gibt es andere Möglichkeit die Fehler zu verhindern? Diese Linkerfehler machen mich wirklich immer fertig. 🙂

    die verschiedenen source files haben anscheinend ihre eigene sin/cos/tan table. du hast mehrere möglichkeiten:
    1. schreibe vor jede table ein 'static', dann gilt die nur innerhalb des files, in dem sie definiert wurde.
    2. ersetze duplikate durch 'extern typ name;' (beispiel: extern char sin_table[];)

    ...aber (ganz wichtig) achte darauf, dass die tables sich nicht in ihrem inhalt unterscheiden.
    🙂


Anmelden zum Antworten