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,
AndiP.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/203Ich habe in keiner meiner eigenen Headerdateien ein
using namespace
stehen, und alles, was aus libnoise gebraucht wird, habe ich mitnoise::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 benutztnoise/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
dasusing 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.