2016-04-24 12 views
1

アンドロイドで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"を含めないように言いますが、一度追加すると正しくコンパイルされます。より良い修正があるかもしれません。

関連する問題