[gelöst] Visual C++ 2010: Fehler LNK4221 "no public symbols found; archive member will be inaccessible"



  • Servus,

    ich portiere gerade eine kleine statische Klassenbibliothek von MinGW(gcc) nach VC9 (Visual C++ 2010). Dabei fällt mir folgende Linkerwarnung auf :

    linearconverter.obj : warning LNK4221: Die Objektdatei definiert keine zuvor undefinierten öffentlichen Symbole. Sie wird daher von keinem Verknüpfungsvorgang verwendet, der diese Bibliothek benutzt.
    

    WTF? Ich habe dann einfach mal weiter gemacht, und festgestellt, dass wenn ich eine Applikation gegen die library linken will, tatsächlich alle Symbole, die aus dieser Compilation Unit kommen müssten, nicht aufgelöst werden.

    Ich habe daraufhin mal gegoogelt und diesen wahnsinnig hilfreichen Knowledgebase-Artikel gefunden: http://support.microsoft.com/kb/815773/en-us
    Super! Dass wenn ich eine leere Datei kompiliere, nichts exportiert wird, da wäre ich ja NIEEEE drauf gekommen.

    Was kann diesen Fehler triggern? Die Funktionen, die in dieser Compilation Unit stehen, werden mit templates zusammengebaut. Kann es sein, dass Visual C++ beim Kompilieren der library die Templates nicht erzeugt, weil es glaubt, sie würden nie instantiiert (was sie in der library selbst ja nicht werden)?

    Bei gcc funktioniert dieser Code seit 2 Jahren fehlerfrei.

    Irgendwelche Ideen zu 4221?

    Philipp



  • Qualitätssoftware, wo man hinguckt!
    Nicht nur, das kein export[1] unterstützt wird, nein, man muss auch noch in einer statischen (!) library __declspec(dllexport) machen, damit eine explizit hingeschriebene Instantiierung auch beachtet wird.

    Super!

    Dreiundzwölfzigster Eintrag auf der Liste der Windows-Würgarounds. Da helfen echt nur noch starke Drogen.

    [1] http://msdn.microsoft.com/en-us/library/x84h5b78.aspx


Anmelden zum Antworten