1
SFML을 컴파일하고 예제 프로젝트를 잘 만들었지 만, 내 프로젝트로 옮겼을 때 링커 오류가 발생했습니다. 다음은 ndk-build의 출력입니다.SFML Android 링커 오류
$ ndk-build
[armeabi-v7a] Compile++ thumb: game <= main.cpp
[armeabi-v7a] Compile++ thumb: game <= Game.cpp
[armeabi-v7a] Compile++ thumb: game <= GameState.cpp
[armeabi-v7a] Compile++ thumb: game <= ResourceManager.cpp
[armeabi-v7a] Prebuilt : libsfml-graphics.so <= <NDK>/sources/sfml/lib/armeabi-v7a/
[armeabi-v7a] Prebuilt : libsfml-audio.so <= <NDK>/sources/sfml/lib/armeabi-v7a/
[armeabi-v7a] Prebuilt : libsfml-network.so <= <NDK>/sources/sfml/lib/armeabi-v7a/
[armeabi-v7a] Prebuilt : libsfml-window.so <= <NDK>/sources/sfml/lib/armeabi-v7a/
[armeabi-v7a] Prebuilt : libsfml-system.so <= <NDK>/sources/sfml/lib/armeabi-v7a/
[armeabi-v7a] SharedLibrary : libgame.so
/Programming/Android/NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in /Programming/Android/NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO ./obj/local/armeabi-v7a/libsfml-graphics.so
/Programming/Android/NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in /Programming/Android/NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO ./obj/local/armeabi-v7a/libsfml-audio.so
/Programming/Android/NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in /Programming/Android/NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO ./obj/local/armeabi-v7a/libsfml-network.so
/Programming/Android/NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in /Programming/Android/NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO ./obj/local/armeabi-v7a/libsfml-window.so
/Programming/Android/NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in /Programming/Android/NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO ./obj/local/armeabi-v7a/libsfml-system.so
jni/Game.cpp:14: error: undefined reference to 'sf::String::String(char const*, std::locale const&)'
jni/ResourceManager.cpp:69: error: undefined reference to 'sf::Texture::loadFromFile(std::string const&, sf::Rect<int> const&)'
jni/ResourceManager.cpp:83: error: undefined reference to 'sf::Font::loadFromFile(std::string const&)'
jni/ResourceManager.cpp:108: error: undefined reference to 'sf::SoundBuffer::loadFromFile(std::string const&)'
jni/ResourceManager.cpp:137: error: undefined reference to 'sf::SoundBuffer::loadFromFile(std::string const&)'
jni/ResourceManager.cpp:153: error: undefined reference to 'sf::SoundBuffer::loadFromFile(std::string const&)'
jni/ResourceManager.cpp:170: error: undefined reference to 'sf::Music::openFromFile(std::string const&)'
jni/ResourceManager.cpp:198: error: undefined reference to 'sf::Music::openFromFile(std::string const&)'
jni/ResourceManager.cpp:213: error: undefined reference to 'sf::Music::openFromFile(std::string const&)'
collect2: error: ld returned 1 exit status
make: *** [obj/local/armeabi-v7a/libgame.so] Error 1
모든 "DSO에 의해 참조되는"오류는 무엇인지 모르지만 정의되지 않은 참조는 의미가 없습니다. 컴파일 할 때 가지고 있지 않은 resourcemanager를 컴파일 할 때 함수에 대한 정의되지 않은 참조가있는 이유는 동일한 라이브러리의 많은 것을 사용하는 게임 클래스를 말하고있는 이유는 무엇입니까?
내 Application.mk 파일 :
NDK_TOOLCHAIN_VERSION := 4.8
APP_PLATFORM := android-9
APP_STL := gnustl_static
APP_CPPFLAGS := -std=c++0x
APP_ABI := armeabi-v7a
내 Android.mk 파일 :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game
LOCAL_SRC_FILES := main.cpp Game.cpp GameState.cpp ResourceManager.cpp
LOCAL_SHARED_LIBRARIES := sfml-system
LOCAL_SHARED_LIBRARIES += sfml-window
LOCAL_SHARED_LIBRARIES += sfml-graphics
LOCAL_SHARED_LIBRARIES += sfml-audio
LOCAL_SHARED_LIBRARIES += sfml-network
LOCAL_WHOLE_STATIC_LIBRARIES := sfml-main
include $(BUILD_SHARED_LIBRARY)
$(call import-module,sfml)
편집 : 아직 정의되지 않은 받고, 정적 수정하는 대신 오류의 첫 번째 세트를 공유로 STL을 연결 참조.