libnoise: mehrdeutiges Symbol-Problem



  • Hallo,

    beim Einbinden der Bibliothek libnoise in VS 2015 bekomme ich immer wieder den folgenden Fehler (in vierfacher Ausführung): "uint:Mehrdeutiges Symbol" und zwar in der Datei qhash.h (Qt wird bei diesem Projekt benutzt).

    Ich habe die Include- und Bibliotheksverzeichnisse meiner Meinung nach richtig gesetzt, die .dll in den Debug-Ordner reingetan (wie ich in manchen Foren gelesen habe), ich habe libnoise sogar mit cmake und VS 2015 erstellt, bekomme aber immernoch den gleichen Fehler. (https://github.com/qknight/libnoise)

    Weiß da jemand was? 😕

    Liebe Grüße,
    Andi

    P.S.: Wenn ich hier im falschen Forum gelandet sein sollte, bitte ich, das zu enstchuldigen. 🙂



  • Hallo,

    ich weiß jetzt, dass es zu einem Namespace-Clash kommt, so wie hier beschrieben:
    https://github.com/g-truc/glm/issues/203

    Ich habe in keiner meiner eigenen Headerdateien ein using namespace stehen, und alles, was aus libnoise gebraucht wird, habe ich mit noise::something versehen.

    Die Fehlermeldung bleibt allerdings. Wahrscheinlich hab ich irgendwas übersehen.
    Wäre schön, wenn mir jemand helfen könnte. Hier ist die Cpp, in der der Fehler vorkommt: NoiseMapClass benutzt noise/noise.h und "noiseutils.h" .
    Der Fehler kommt tritt übrigens genau 4 mal in dieser cpp auf.

    #include "Tile.hpp"
    #include <QPainter>
    
    Tile::Tile(int x_, int y_, QGraphicsItem* parent) : x(x_), y(y_), QGraphicsItem(parent) {
    
    	float terrain = noiseMap->get_NoiseValue(x, y);
    	if (-1.000 <= terrain && terrain < -0.25) type = DEEP_SEA;
    	else if (-0.25 <= terrain && terrain < 0.0625) type = SHALLOW_WATER;
    	else if (-0.0625 <= terrain && terrain < 0.375) type = SAND;
    	else if (0.375 <= terrain && terrain < 0.75) type = EARTH;
    	else if (0.75 <= terrain && terrain <  0.95) type = ROCKS;
    	else if (0.95 <= terrain && terrain <= 1.000) type = SNOW;
    	else type = SNOW;
    }
    
    QRectF Tile::boundingRect() const {
    	return QRectF(0, 0, x, y);
    }
    
    void Tile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
    
    	switch (this->type) {
    	case DEEP_SEA: painter->setBrush(QColor::QColor(0,0,138)); break;
    	case SHALLOW_WATER: painter->setBrush(QColor::QColor(41, 124, 255)); break;
    	case SAND: painter->setBrush(QColor::QColor(255, 217, 101)); break;
    	case EARTH: painter->setBrush(QColor::QColor(184, 100, 9)); break;
    	case ROCKS: painter->setBrush(QColor::QColor(105, 101, 98)); break;
    	case SNOW: painter->setBrush(Qt::white); break;
    	}
    
    	painter->drawRect(x, y, SIZE, SIZE);
    
    }
    
    void Tile::create_noiseMap() {
    	noiseMap = new NoiseMapClass();
    }
    

    Und die NoiseMapClass.h:

    #pragma once
    #include <noise\noise.h>
    #include "noiseutils.h"
    
    class NoiseMapClass
    {
    public:
    	NoiseMapClass();
    	~NoiseMapClass();
    	noise::utils::NoiseMap noiseMap;
    	static void generate_noiseMap();
    	float get_NoiseValue(int x, int y);
    };
    

    Wäre echt stark, wenn mir jemand weiterhelfen könnte. Wenn ich die Frage falsch gestellt haben sollte, weist mich bitte darauf hin. Danke euch! 👍



  • Also das Problem taucht auf jeden Fall schon auf, wenn ich den Header noiseutils.h include. 😕

    EDIT: Okay, das Problem mit dem mehrdeutigen Symbol habe ich dadurch gelöst, dass ich in der noiseutils.h das using namespace noise; auskommenteirt habe.

    Nun ergibt sich allerdings diese Fehlermeldung:

    Schweregrad	Code	Beschreibung	Projekt	Datei	Zeile	Unterdrückungszustand
    Fehler	LNK1120	1 nicht aufgelöste Externe	BioSimQtA4	C:\Users\...\x64\Debug\\BioSimQtA4.exe	1	
    
    Schweregrad	Code	Beschreibung	Projekt	Datei	Zeile	Unterdrückungszustand
    Fehler	LNK2001	Nicht aufgelöstes externes Symbol ""public: static class noise::utils::NoiseMap * Tile::noiseMapC" (?noiseMapC@Tile@@2PEAVNoiseMap@utils@noise@@EA)".	BioSimQtA4	C:\Users\...\Tile.obj	1
    


  • Ok, es hat sich erledigt. Ich habe statt einer unnötigen Wrapper-Klasse jetzt direkt noise::utils::NoiseMap benutzt, und es hat funktioniert.


Anmelden zum Antworten