VS 2010 Linker-Fehler bei externem (älteren) Projekt



  • Hio!

    Ich versuche gerade ein Projekt mit einem externen Projekt unter Visual Studio 2010 zum Laufen zu bewegen, aber irgendwie will das nicht so recht.
    Ich möchte einen evolutionären Algorithmus für ein Programm implementieren und fand dazu folgendes:
    http://www.codeproject.com/KB/recipes/geneticlibrary.aspx

    Ich habe die Visual Studio 2005 Projekte der "GeneticLibrary", die dem Quellcode beigefügt sind problemlos in VS 2010 einbinden können und VS 2010 hat diese auch automatisch konvertiert. Dann habe ich das Projekt (also die GeneticLibrary) compiliert/gelinkt, was auch problemlos funktionierte und ich so schließlich meine *.dll und *.lib Dateien hatte.

    Das GeneticLibrary-Projekt habe ich dann zu _meinem_ Projekt hinzugefügt und wollte das Ganze dann ausführen. Hier hat mir VS2010 jedoch folgenden Fehler gegeben:

    error LNK2001: unresolved external symbol "private: static class Population::GaPopulationConfiguration * Population::GaPopulationConfiguration::_default" (?_default@GaPopulationConfiguration@Population@@0PAV12@A)
    1>C:\Users\avigle\Documents\Visual Studio 2010\Projects\mtsp_ga\Debug\mtsp_ga.exe : fatal error LNK1120: 1 unresolved externals
    1>
    

    Sieht mir erstmal nach einem Linker-Fehler aus. Also habe ich die Header und den Linker-Pfad mal manuell in mein Projekt eingebunden, also das GeneticLibrary-Projekt wieder herausgenommen und manuell die Pfade unter Properties->Linker->Input bzw. Properties->Linker->General gesetzt. Leider kam dabei auch derselbe Fehler zustande.

    Hat jemand eine Idee woran das liegen könnte? Ich habe bereits schon versucht beide Projekte auf debug und release umzustellen, aber auch ohne Erfolg.

    Gruß
    Pille456


  • Mod

    Kontrolliere mal ob wirklich eine Implementierung für diese Funktion vorhanden ist und ob die Signatur 100% passt!



  • Hio,

    sorry, ich konnte nicht eher antworten.
    Ich habe den Quellcode nochmal gescheckt und finde die entsprechende Funktion mit gleicher Signatur:

    /// <summary>Contatins interfaces, classes and datatypes used to implement population of chromosomes and genetic operations.</summary>
    namespace Population
    {
            //... ganz viele Klassendefinitionen
    
    	class GaPopulation;
    
    	/// <summary>This class stores parameters and genetic operations of a population or a group of populations. All populations bound to the configuration,
    	/// are updated and notified every time when configuration is changed. Note that each population copies parameters' of the population and use local copy.
    	///
    	/// This class has no built-in synchronizator, so <c>LOCK_OBJECT</c> and <c>LOCK_THIS_OBJECT</c> macros cannot be used with instances of this class.
    	/// No public or private methods are thread-safe.</summary>
    	class GaPopulationConfiguration
    	{
    
    	private:
    
    		/// <summary>Global instance of default configuration.</summary>
    		static GaPopulationConfiguration* _default;
    
            //... mehr Klassendefinitionen
    

    Gruß
    Pille456



  • Hier fehlt wohl einfach ein __declspec(dllexport).

    Oder verwendet die Library vielleicht ein .def File zum exportieren? Dann könnte es einfach daran liegen, dass unterschiedliche VS Versionen z.T. leicht unterschiedliche "decorated names" erzeugen.


  • Mod

    Wo ist die Initialisierung für diesen static?

    namespace Population
    {
    ...
    static GaPopulationConfiguration* GaPopulationConfiguration::_default = NULL; 
    ...
    }
    


  • Hi!

    Ich konnte leider nicht eher antworten, da ich gerade einen Umzug hinter mir habe und zwischendurch mit Grippe im Bett lag. Naja ich habe mich heute mal wieder drangesetzt:

    Wo ist die Initialisierung für diesen static?

    In der Datei Population.cpp, irgendwo mittendrin. Also in keiner speziellen Funktion, sondern zwischen 2 Funktionen.

    Hier fehlt wohl einfach ein __declspec(dllexport).

    Soweit ich das mit __declspec(dllexport) verstehe, reicht es das vor den static zu schreiben? Oder vor den gesamten Namespace? Direkt vor der statischen Variable zeigt es jedenfalls keine Wirkung.

    Def-Dateien werden nicht verwendet soweit ich das sehe.

    VG

    Pille456


Anmelden zum Antworten