- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在尝试使用 ndk 构建库时遇到此错误:
$ /cygdrive/d/android-ndk-r10d/ndk-build.cmd [armeabi] SharedLibrary : libgame.so
jni/core/src/coreApplication.cpp:9: error: undefined reference to 'CCoreMessaging::CCoreMessaging()'
jni/core/src/coreApplication.cpp:11: error: undefined reference to 'CCoreScreenContainer::CCoreScreenContainer()'
jni/core/src/coreReference.h:75: error: undefined reference to 'CCoreRefClass::_RemoveRef(void*, bool)'
jni/core/src/coreReference.h:76: error: undefined reference to 'CCoreRefClass::_AddRef(void*, bool)'
jni/core/src/coreReference.h:58: error: undefined reference to 'CCoreRefClass::_RemoveRef(void*, bool)'
jni/core/src/coreReference.h:58: error: undefined reference to 'CCoreRefClass::_RemoveRef(void*, bool)'
jni/core/src/coreApplication.h:12: error: undefined reference to 'CCoreMessaging::~CCoreMessaging()'
jni/core/src/coreReference.h:58: error: undefined reference to CCoreRefClass::_RemoveRef(void*, bool)'
collect2.exe: error: ld returned 1 exit status
make.exe: *** [obj/local/armeabi/libgame.so] Error 1
核心应用.h:
<other includes>
#include "coreResources.h"
#include "coreMessaging.h"
class CCoreApplication
{
public:
CCoreApplication(CCoreContext& a_context);
virtual ~CCoreApplication() {}
CCoreScreenContainer& GetScreenContainer() { return *m_screenContainer; }
CCoreMessaging& GetMessages() { return m_messages; }
<other functions and properties>
CCoreMessaging m_messages;
};
核心应用程序.cpp
#include "coreApplication.h"
#include "coreMessaging.h"
#include "coreScreenContainer.h"
<other includes>
CCoreApplication::CCoreApplication(CCoreContext& a_context):
m_context(a_context)
{
m_screenContainer = new CCoreScreenContainer;
GetScreenContainer().SetBounds(CRectangle(0,0, a_context.GetPlatformHandler()->GetResolutionWidth(), a_context.GetPlatformHandler()->GetResolutionHeight()));
}
coreMessaging.h:
class CCoreMessaging
{
public:
CCoreMessaging();
~CCoreMessaging();
void SendMessage(int a_messageID, void* argument0=0, void* argument1=0);
void AddMessageHandler(CCoreMessageHandle& handle, CCoreMessageDelegate handler);
void RemoveMessageHandler(CCoreMessageHandle& handle);
protected:
typedef std::map<int, CCoreMessageDelegate> Map;
Map m_Delegates;
int m_AutoIncrement;
int m_SelfID;
static int m_SelfIDIncrement;
};
核心消息.cpp
#include "coreMessaging.h"
<other functions>
CCoreMessaging::CCoreMessaging() : m_AutoIncrement(1)
{
m_SelfID = m_SelfIDIncrement++;
gMessaging[m_SelfID] = this;
if(m_SelfID > 127)
throw std::runtime_error("too many messaging instances");
}
核心引用.h
class MFAPI CCoreRefClass
{
public:
virtual void Delete() { delete this; }
void _AddRef(void* cls, bool strong);
void _RemoveRef(void* cls, bool strong);
void _IncRef();
bool _DecRef(); // returns true if reference decrease has lead to destruction. false if object is still valid
protected:
CCoreRefClass();
virtual ~CCoreRefClass();
typedef CCoreRefPtr<CCoreRefClass,false> RefType;
std::vector<RefType*> m_refData;
int m_refCount;
};
核心引用.cpp
#include "coreReference.h"
<other functions>
void CCoreRefClass::_RemoveRef( void* cls, bool strong )
{
RefType* refCls = (RefType*)cls;
int lastIdx=(int)m_refData.size()-1;
int refIdx = refCls->m_arrayIndex;
refCls->m_arrayIndex = -1;
// swap erase reference
m_refData[refIdx] = m_refData[lastIdx];
m_refData[refIdx]->m_arrayIndex = refIdx;
m_refData.pop_back();
if(strong)
_DecRef();
}
void CCoreRefClass::_AddRef( void* cls, bool strong )
{
if(strong)
_IncRef();
RefType* refCls = (RefType*)cls;
m_refData.push_back(refCls);
refCls->m_arrayIndex = (int)m_refData.size()-1;
}
大多数这些错误似乎是由打字错误产生的,但这段代码确实在 visual studio 中作为 lib 完全编译。我希望这只是我错过或没见过的东西。如果需要,请随时提出更多要求。
编辑:应用.mk
APP_STL := gnustl_static
APP_CPPFLAGS += -std=c++11
NDK_TOOLCHAIN_VERSION := 4.8
APP_PLATFORM := android-14
安卓.mk
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := game
LOCAL_SRC_FILES := coreBridge.cpp core/game.cpp core/src/coreApplication.cpp
LOCAL_LDLIBS := -llog -lGLESv2
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_EXECUTABLE)
最佳答案
感谢 Bogdan V。我发现我需要包含所有源文件。但不是将它们全部单独链接,而是它们都可以同时链接:
Android.mk:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := libgame
LOCAL_SRC_FILES := coreBridge.cpp core/game.cpp
FILE_LIST := $(wildcard $(LOCAL_PATH)/../../../core/src/*.cpp)
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../core/include
LOCAL_LDLIBS := -llog -lGLESv2
LOCAL_CPP_FEATURES += exceptions
LOCAL_SHARED_LIBRARIES := libgame.so
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_EXECUTABLE)
哪里:
FILE_LIST := $(wildcard $(LOCAL_PATH)/../../../core/src/*.cpp)
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../core/include
是将它们全部联系起来的重要部分。毕竟,这让我能够创建 .so。
关于c++ - 为什么 NDK 在构建时抛出 undefined reference 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28578830/
我想使用 ndk 构建一个 3rd 方库 avahi。 avahi 已经有 android 端口(带有有效的 Android.mk)。 我做了什么: 我已经成功创建了一个项目并将所有源代码复制到 jn
由于不再需要Android NDK,因此我尝试将其卸载。在Eclipse中找到的路径似乎已损坏。我应该如何清理这个烂摊子?我尝试了brew,但它说未安装NDK。 (它甚至告诉我未安装SDK!也许不是通
我是 Android Studio 和 Android NDK 的新手。我正在尝试使用 android NDK 为类分配编译一个简单的 hello.c 程序。我已按照以下项目说明进行操作,但出现错误:
当我尝试执行 NDK 构建时,我收到以下错误列表...有人知道吗? encies\FreeImage/D:/Projects.CPP/Engine5/svn/trunk/Dependencies/Fr
我正在使用 android-ndk-profiler-3.1 为我的项目进行 NDK 分析。我在 Android.mk 中进行了如下更改... LOCAL_PATH := $(call my-dir)
我需要使用 cutils 库和头文件在我的 NDK 项目中实现 ashmem,但我在我的系统中找不到与 cutils 相关的任何内容。它位于何处或从何处获得? 最佳答案 Android“cutils”
我有两个独立的项目,一个项目用于构建 Boost 库,另一个项目从构建的 boost 库中调用。 Boost 项目编译良好并生成 libboost.a 文件。我想要实现的是将此库添加到我的其他 NDK
我在ndk-build clean上遇到以下错误 mo@mo-Toshiba ~/Workspace/AndroidApp/jni/android_programming_driver $ ndk-b
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在尝试使用 NDK(又使用开放 SLES)在 Android 上创建一个基于流的音频应用程序。我已经完成了基本的流媒体设置。我需要知道 Android 中如何处理欠载(或重载)?错误回调是如何实现
我的 Application.mk 设置为构建 arm 以及 x86 共享库: APP_ABI :- armeabi-v7a x86 我有预建的 openssl 静态库: libcrypto_v7a.
我的 $NDK_HOME 文件夹包含标准库的不同实现。 qdii@nomada /opt/android-ndk/platforms $ ls -l total 24 drwxr-xr-x 5 roo
如何安装android-ndk。我已经为 ndk 设置了路径,但在执行“ndk-build”命令时仍然出现错误。 fya 我正在使用 Windows 操作系统。 最佳答案 它对我有用: 打开命令提示符
构建 Android-ndk 时出现以下错误 请帮助我。 Cygwin.bat @echo off set IS_UNIX= set DEV_ROOT=C:/iliu-Android-NDK-Fibo
我开始使用 android ndk (r8c),为此我安装了新版本的 Ubuntu 12.10 (32bit) 问题,无论我尝试构建什么,我都会遇到让我发疯的怪异错误...... ~/workspac
我正在尝试向我的 Android 项目添加 Crashlytics 支持,该项目使用 NDK 和 gradle CMake。这意味着我的共享项目需要符号。所以如果我想为发布版本创建符号,我会调用 gr
我想知道是否有人设法使用 Android NDK(r8d) 的工具链构建了新的 SDL2。 SDL2 似乎非常接近发布(从昨天开始,它不再是“正在 build 中:http://hg.libsdl.o
我试图在“ndk-build”过程中禁用所有警告,以编译与 Android 上的 JNI 一起使用的 CPP 代码。 我正在使用 LOCAL_CFLAGS := -Wno-error没有成功。 有任何
谁能告诉我如何在android(ndk-build)中建立C-ares库 最佳答案 这是使用NDK standalone toolchain将其构建为ARMv7的静态库的方法: export NDK=
我正在尝试从我的 native 代码中读取一个简单的文本文件。 我把file.txt放在assets文件夹下 在我的事件中,我正在创建 Assets 管理器:assetManager = getAss
我是一名优秀的程序员,十分优秀!