본문 바로가기
# 버그 메모장

[solved]Android-Studio :: error: undefined reference to ...

by 쁘레레레레레 2020. 4. 3.
Build command failed.
Error while executing process C:\Users\atlan\AppData\Local\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build C:\Users\atlan\Desktop\revenant\proj.android\app\.externalNativeBuild\cmake\debug\x86 --target MyGame}
[1/737] Building CXX object engine/external/recast/CMakeFiles/ext_recast.dir/Detour/DetourNavMeshQuery.cpp.o
[2/737] Building CXX object engine/external/recast/CMakeFiles/ext_recast.dir/DebugUtils/DebugDraw.cpp.o

~
생략
~

C:\Users\atlan\Desktop\revenant\Classes\ParallaxScrollOffset.cpp:31:9: warning: 'this' pointer cannot be null in well-defined C++ code; pointer may be assumed to always convert to true [-Wundefined-bool-conversion]
    if(!this) return NULL;
       ~^~~~
1 warning generated.
[737/737] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libMyGame.so
FAILED: cmd.exe /C "cd . && C:\android-ndk\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=i686-none-linux-android --gcc-toolchain=C:/android-ndk/toolchains/x86-4.9/prebuilt/windows-x86_64 --sysroot=C:/android-ndk/sysroot -fPIC -isystem C:/android-ndk/sysroot/usr/include/i686-linux-android -D__ANDROID_API__=16 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -frtti -fexceptions -fsigned-char -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot C:/android-ndk/platforms/android-16/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -LC:/android-ndk/sources/cxx-stl/llvm-libc++/libs/x86 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libMyGame.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libMyGame.so CMakeFiles/MyGame.dir/Classes/AppDelegate.cpp.o CMakeFiles/MyGame.dir/Classes/GameScene.cpp.o CMakeFiles/MyGame.dir/Classes/AppManager.cpp.o CMakeFiles/MyGame.dir/Classes/GLES-Render.cpp.o CMakeFiles/MyGame.dir/Classes/PhysicsShapeCache.cpp.o CMakeFiles/MyGame.dir/Classes/StartScene.cpp.o CMakeFiles/MyGame.dir/Classes/Entity.cpp.o CMakeFiles/MyGame.dir/Classes/Player.cpp.o CMakeFiles/MyGame.dir/Classes/ContactListener.cpp.o CMakeFiles/MyGame.dir/Classes/ParallaxNodeExtras.cpp.o CMakeFiles/MyGame.dir/Classes/ParallaxScrollNode.cpp.o CMakeFiles/MyGame.dir/Classes/ParallaxScrollOffset.cpp.o CMakeFiles/MyGame.dir/Classes/SneakyButton.cpp.o CMakeFiles/MyGame.dir/Classes/SneakyButtonSkinnedBase.cpp.o CMakeFiles/MyGame.dir/Classes/SneakyJoystickSkinnedBase.cpp.o CMakeFiles/MyGame.dir/proj.android/app/jni/hellocpp/main.cpp.o  -Wl,--whole-archive engine/cocos/platform/libcpp_android_spec.a -Wl,--no-whole-archive lib/libcocos2d.a lib/libexternal.a ../../../../../../cocos2d/external/Box2D/prebuilt/android/x86/libbox2d.a ../../../../../../cocos2d/external/chipmunk/prebuilt/android/x86/libchipmunk.a ../../../../../../cocos2d/external/freetype2/prebuilt/android/x86/libfreetype.a lib/libext_recast.a ../../../../../../cocos2d/external/jpeg/prebuilt/android/x86/libjpeg.a ../../../../../../cocos2d/external/webp/prebuilt/android/x86/libwebp.a ../../../../../../cocos2d/external/bullet/prebuilt/android/x86/libLinearMath.a ../../../../../../cocos2d/external/bullet/prebuilt/android/x86/libBulletDynamics.a ../../../../../../cocos2d/external/bullet/prebuilt/android/x86/libBulletCollision.a ../../../../../../cocos2d/external/bullet/prebuilt/android/x86/libLinearMath.a ../../../../../../cocos2d/external/bullet/prebuilt/android/x86/libBulletMultiThreaded.a ../../../../../../cocos2d/external/bullet/prebuilt/android/x86/libMiniCL.a ../../../../../../cocos2d/external/tiff/prebuilt/android/x86/libtiff.a ../../../../../../cocos2d/external/websockets/prebuilt/android/x86/libwebsockets.a ../../../../../../cocos2d/external/uv/prebuilt/android/x86/libuv_a.a ../../../../../../cocos2d/external/openssl/prebuilt/android/x86/libssl.a ../../../../../../cocos2d/external/openssl/prebuilt/android/x86/libcrypto.a lib/libext_tinyxml2.a lib/libext_xxhash.a lib/libext_xxtea.a lib/libext_clipper.a lib/libext_edtaa3func.a lib/libext_convertUTF.a lib/libext_poly2tri.a lib/libext_md5.a ../../../../../../cocos2d/external/curl/prebuilt/android/x86/libcurl.a ../../../../../../cocos2d/external/png/prebuilt/android/x86/libpng.a engine/external/android-specific/cpufeatures/libext_cpufeatures.a -ldl lib/libext_pvmp3dec.a lib/libext_tremolo.a ../../../../../../cocos2d/external/zlib/prebuilt/android/x86/libz.a lib/libext_unzip.a -lGLESv2 -lEGL -llog -landroid -lOpenSLES -latomic -lm "C:/android-ndk/sources/cxx-stl/llvm-libc++/libs/x86/libc++.a" && cd ."
C:\Users\atlan\Desktop\revenant\Classes/GameScene.cpp:185: error: undefined reference to 'SneakyJoystick::SneakyJoystick()'
C:\Users\atlan\Desktop\revenant\Classes/GameScene.cpp:186: error: undefined reference to 'SneakyJoystick::initWithRect(cocos2d::Rect)'
C:\Users\atlan\Desktop\revenant\Classes/SneakyJoystickSkinnedBase.cpp:98: error: undefined reference to 'SneakyJoystick::setThumbRadius(float)'
C:\Users\atlan\Desktop\revenant\Classes/SneakyJoystickSkinnedBase.cpp:100: error: undefined reference to 'SneakyJoystick::setThumbRadius(float)'
C:\Users\atlan\Desktop\revenant\Classes/SneakyJoystickSkinnedBase.cpp:103: error: undefined reference to 'SneakyJoystick::setJoystickRadius(float)'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

 개발을 계속하던 중 중반부가 넘었다고 판단해 포팅을 시도하던 중 발견되었다.

눈에 띄는 에러문구는 error: undefined reference to... 

검색을 시도했고 #indef __cplusplus extern "C" ~~~ 이런 작업도 해봤고

android 폴더 내 gradle - cmake 관련쪽에서도 건드려보았다.

 

하지만 오류는 잡히지 않았다.

한번에 20개가 넘는 cpp/h 파일이 추가되는 바람에 오류 잡기도 힘들다.

어디서 난 에러인지는 대충 예상도 가는데 실험하는 족족 스튜디오 내 빌드가 수시로 멈추거나

에러로 대답한다.

 

개노답 상황

 

=======================================================

2020년 5월 14일 수정

 

수정하는걸 그동안 까먹었었는데

 

간단하다. CMake쪽에서 classes / cpp 그리고 android.mk

에서 경로 설정을 너무 생각없이 했었다.

 

내 프로젝트의 폴더 경로는 대부분이 classes에 되어있긴하나 , 일부 entity, player등의 파일은 Entities라는 폴더 안에 있다. 경로를 그냥 classes/Player.h or cpp였던걸

classes/Entities/Player.h 이런식으로 해주면 된다.

 

아마 android.mk 파일에서 헤더 파일 추가쪽에 코드가 한줄이라 최상위 폴더 하나만 잡아줘도 되겠거니.. 했던게 오류를 일으켰다.  저 부분만 수정을 해준 뒤 제대로 빌드를 해주니 문제없이 돌아간다