2016-04-24 44 views
1

我正在編譯一個在android上使用SFML的程序。它通常在我用g ++編譯時編譯。當我在Android項目目錄中運行NDK建造我得到以下錯誤:對vtable SFML的未定義引用Android

/home/engineer/Desktop/android_ndk/android-ndk-r11c/toolchains/arm- linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function (see go/missingkeymethod) 
/home/engineer/Desktop/android/jni/SandJar.hpp:16: error: undefined reference to 'vtable for SandJar' 

我有一個抽象類,罐和2類sandyJar和sandjar既繼承它。但是,我不明白它爲什麼編譯爲g ++,但不適用於ndk-build命令。 這裏有一些精簡的源文件(從主編譯):

Main.cpp的:

int main(int argc, char *argv[]) 
{ 
    sf::RenderWindow window(sf::VideoMode::getDesktopMode(), ""); 

    int WIDTH = window.getSize().x; 
    int HEIGHT = window.getSize().y; 

    vector<Jar*> jars; 

    SandJar SJAR(5,5,5,WIDTH, HEIGHT); 
    CandyJar CJAR(5,5,5,WIDTH, HEIGHT); 
    CJAR.add(); 
    CJAR.move(120, 0); 

    jars.push_back(&CJAR); 
    jars.push_back(&SJAR); 
    etc. 
} 

Jar.hpp

class Jar 
{ 
    public: 

     virtual void add() = 0; 
     virtual void draw(sf::RenderWindow&) = 0; 
     virtual void update() = 0; 
     virtual void move(int,int) = 0; 
     virtual void setScale(float) = 0; 
     virtual void incAnim() = 0; 
     virtual void decAnim() = 0; 

}; 

SandJar.hpp

class SandJar : public Jar 
{ 

public: 
    //initializer 
    SandJar(const int, const int, const int, const int, const int); 
    SandJar(const int); 
    //function for adding candy 
    void add(); 
    void update(); 
    void draw(sf::RenderWindow&); 

    void incAnim(); 
    void decAnim(); 
    void move(int, int); 
    void setScale(float); 

private: 
//vars 
}; 

SandJar.cpp

SandJar::SandJar(int Capacity){ 

} 

SandJar::SandJar(int Width, int Height, int Capacity, int WindowW, int WindowH){ 

} 

void SandJar::init() { 

} 

void SandJar::incAnim() { 

} 

void SandJar::decAnim() { 

} 

void SandJar::move(int x, int y) 
{ 

} 

void SandJar::setScale(float scl) 
{ 
} 

void SandJar::update() { 

} 

void SandJar::add() { 

} 

void SandJar::draw(sf::RenderWindow& window) { 

} 

回答

1

事實證明,任何代碼都沒有問題。問題是用於該項目的Android.mk文件。我將hpp和cpp文件附加到LOCAL_SRC_FILES並正確構建。它表示不要在LOCAL_SRC_FILES中包含「includes」,但是一旦添加它就可以正確編譯。可能有更好的解決方法。

相關問題