2015-09-06 173 views
1

我學習使用SFML與製作小遊戲的想法,到目前爲止,我已經創建了一個窗口和混亂有關它的設置,並設置了抽獎循環和事件處理程序。SFML loadFromFile未定義參考

麻煩啓動一次我試着用下面的代碼添加到我的第一個紋理:

#include "SpaceNomad.ih" 

void MainMenu(GameEngine &Engine) 
{ 
    sf::Texture texture; 

    if(!texture.loadFromFile("MenuBackGround.png")) 
    { 
     cout << "couldn't load background texture\n"; 
    } 

    sf::Sprite *sprite = new sf::Sprite; 
    sprite->setTexture(texture); 

    Engine.AddEntity(sprite, 5); 
} 

這是一個不同的圖像字面上的SFML tutorial page給出的示例代碼之外。

當我嘗試編譯此我得到以下錯誤:

||=== Build: Debug in space nomad (compiler: GNU GCC Compiler) ===| 
obj\Debug\projects\st\take2\MainMenu.o||In function  `Z8MainMenuR10GameEngine':| 
D:\projects\st\take2\MainMenu.cpp|7|undefined reference to `_imp___ZN2sf7Texture12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_4RectIiEE'| 
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 

我已經檢查了所有的SFML庫都包含在構建選項(我使用的代碼::與海灣合作委員會MinGW的塊) 。

https://drive.google.com/file/d/0B4qzXcgqbLZtcHJWUy1vSUhpdVk/view?usp=sharing

其他主題我見過處理的人取得了自己的功能未定義的引用,但在這裏我使用的庫。

編輯:我只是試着與同一libary基本形狀:

sf::CircleShape *shape = new sf::CircleShape(50); 

    // set the shape color to green 
    shape->setFillColor(sf::Color(100, 250, 50)); 

    Engine.AddEntity(shape, 5); 

來編譯和顯示沒有問題。

+0

不過,我要補充的是,即使你修復未定義引用錯誤,你將面對的'白色正方形problem'。我也不認爲這是一個好的設計,只要你可以使用堆。爲什麼你的'sf :: Sprite'-Instance不在堆棧上? – NaCl

+0

這個想法是保持背景或按鈕等對象的執行以及繪製循環的分離,其中繪製循環只有一個指向它需要繪製的對象的指針。這裏的對象實現還沒有實現。如果我把它放在堆棧中,它會在它被繪製的時候被清理乾淨。 –

+0

您的紋理在繪製前被清理乾淨。精靈只有一個指向紋理的指針,而不是紋理本身的整個副本。因此你會注意到紋理不會被繪製。 – NaCl

回答

1

你使用的是具有不同的運行時或不同的運行時ABI編譯SFML庫比你鏈接您對應用程序。

如果您SFML庫沒有與你有相同的編譯器編譯,那麼你就需要重建。

如果您設置了您的應用程序(例如不同的ABI,C++ 14等)的任何特殊標誌,你必須重建SFML使用相同的標誌,以及,或從項目中刪除。

此外,它只是有時會發生,因爲它不會影響整個運行時庫,但像std::string這樣的部分在調用loadFromFile函數時會被使用。

+0

謝謝,我之前使用過預編譯的庫,試圖從源代碼中進行編譯,並給出了常量。導致我安裝了一個新的MinGW安裝,並重新編譯,最終解決了這個問題。 –

+0

對於仍在努力解決這個問題的人們:我發現SFML必須針對'libjpeg-turbo',** NOT **'libjpeg'進行編譯。這就是'loadFromFile'失敗的原因。 (如果你使用ArchLinux,你需要安裝'aur/mingw-w64-libjpeg-turbo'軟件包,然後重新編譯'aur/mingw-64-sfml'。掙扎數小時後爲我工作! –

+0

這是** NOT ** true。'libjpeg-turbo'和'libjpeg'共享相同的API,所以你明顯可以使用任何一個版本,所有你需要確保你使用8.x API版本而不是9.x。非常懷疑你得到了與OP相同的錯誤,所以你的評論在這裏甚至沒有關係。 – Lukas