`__android_log_print '에 대한 정의되지 않은 참조


100

내 make 파일에 어떤 문제가 있습니까?

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := foo
LOCAL_SRC_FILES := foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

foo.c

#include <string.h>
#include <jni.h>
#include <android/log.h>

#define  LOG_TAG    "foo"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

void test() {
    LOGI("test");
}

ndk 빌드

foo.c:9: undefined reference to `__android_log_print'

답변:


89

Android.mk파일 에서 다음을 시도 하십시오.

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

1
이것을 추가하려면 무엇이 필요합니까? 자세히 설명해 주시겠습니까?
Dhasneem 2013 년

그것은 make 파일에 안드로이드 라이브러리를 추가하는 것입니다. – 그리고 그것은 나에게도
효과적이었습니다

9
-L은 불필요합니다. 대신 다른 답변을 수락하십시오.
Jeff Allen

5
Android Studio 1.3에서 새로운 Gradle NDK 통합을 사용하는 경우 ldLibs = ["android", "log"]android.ndk 옵션 에 추가 해야합니다
Stephen Kaiser

1
Android.mk를 사용하지 않으면 어떻게됩니까?
cagdas

99

추가해야합니다.

LOCAL_LDLIBS := -llog

Android.mk로


1
옳은. 여러 라이브러리가있는 경우, 필요 (CLEAR 바르 후) 그들 각각이 문을 추가합니다
user13107

86

Android Studio 및 gradle을 사용하는 경우 Android.mk를 무시합니다. build.gradle 파일에 다음을 추가하십시오.

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}

7
이것이 어디에 기록되어 있는지 궁금합니다. 나는 이것도 찾고 있었다.
Randy Sugianto 'Yuku''14

1
을 추가하기 전에 " '__android_log_print'에 대한 정의되지 않은 참조"가 발생했습니다 ldLibs. 감사.
Denis Kniazhev

2
이것을 추가하면 문제가 해결되었습니다. 프로젝트 폴더 (모듈 이름) 대신 폴더 ndk내부의 build.gradle에 부품 을 추가해야합니다 app.
mathiass

Gradle 2.5부터 'ldLibs + = "log"'약간의 구문 변경 사용
Lorne K

15
이것은 나를 위해 작동하지 않았습니다. 이 내가해야 할 일을했을 것입니다ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ

29

Android Studio 2.2 및 tools.build:gradle:2.2.0의 경우 CMake를 사용하여 CMakeLists.txt에서 행을 추가하거나 편집합니다.

target_link_libraries(<your_library_name> 
                      android 
                      log)

로그 라이브러리를 연결하는 것입니다.


16

Android Studio 2.1로 업그레이드하면 위의 답변이 작동하지 않으므로 ldLibs.add ()를 사용하여 아래와 같이 lib를로드해야합니다.

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}

최고의 모던 (2017 년 말) 답변
Edgar Aroutiounian 2017-09-02

7

Android에서 공유 라이브러리를 3 가지 방법으로 연결할 수 있습니다. 3 개 이하의 경우 언급 된 줄을Android.mk

여기에 세 가지 방법이 있습니다.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

어떤 이유로 1이 작동하지 않으면 (나에게 적합하지 않음), 아래 두 가지 방법을 시도 할 수 있습니다.

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

물론 #include <android/log.h> C / H 파일 에도 포함시켜야 합니다.


6

작업중인 프로젝트에 다른 '표준'답변과 다른 다음과 같은 특성이있는 경우 :

  • Android Studio를 사용하지 않음
  • Gradle 및 통합 CMake를 사용하지 않음
  • 빌드에 Android.mk 또는 Application.mk가 전혀 사용되지 않음
  • CMake 및 도구 모음을 직접 사용 (프로젝트가 Qt 기반이고 QtCreator를 사용하지 않을 수도 있음)

다음 target_link_libraries 사용법은 다음과 같습니다 .

    find_library(ANDROID_LOG_LIB log)
    target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})

TARGET_NAME(와 전에 가진 세트를 구축하는 대상의 이름 add_library또는 add_executable).

find_library물론 제대로 툴체인을 설정으로 (안드로이드 SDK에서 제공하는 툴체인을 사용 똑같이 중요 ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake이 설정되도록 CMAKE_SYSROOT에서 사용되는 find_명령).


나를 도운 유일한 솔루션! 감사합니다. 라이브러리가 개발자에게 더 나은 피드백을 위해 발견되면 테스트를 통해 확장하겠습니다. stackoverflow.com/a/37868829/10030695
ManuelTS

4

예, 다음을 추가해야합니다. LOCAL_LDLIBS := -llog다른 답변 / 댓글이 지정되었지만 원래 질문은 jni 라이브러리를 다음 LOCAL_JNI_SHARED_LIBRARIES과 같이 사용하는지 여부를 지정하지 않았습니다.LOCAL_REQUIRED_MODULES .

나는 그가 그것을 다음과 같이 사용했다고 확신 할 수 있습니다 : 질문 LOCAL_REQUIRED_MODULES때문에 LOCAL_EXPORT_LDLIBS := -llog... 편집 후에 추가되지 않는 한.

LOCAL_REQUIRED_MODULES공유 라이브러리 를 사용 하는 경우 apk가 아닌 / system / lib에 설치되는 것은 필수 모듈이기 때문입니다. 따라서 빌드 시스템이 jni 공유 라이브러리를 빌드 및 링크 할 때 정의가 올바른 위치에 있고 에서 빌드 할 수 있도록하는 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog대신 추가해야합니다 . 그렇지 않으면을 추가하더라도 동일한 답변을 계속 얻을 수 있습니다 .LOCAL_LDLIBS := -llog-llog$OUT/root/system/libLOCAL_LDLIBS := -llog

그래서, -L필요하지 않다고 말한 사람들 과 다른 대답은 맞았지만 실제로이 상황에서는 틀 렸습니다.


실제로 무슨 일이 일어나고 있는지 설명해 주셔서 감사합니다!
Richard

4

대신

Android 스튜디오 1.3에서 새로운 Gradle NDK 통합을 사용하는 경우 android.ndk 옵션에 ldLibs = [ "android", "log"]를 추가해야합니다 – Stephen Kaiser 9 월 24 일 4:20

사용하는 ldLibs.addAll(["android", "log"])실험 플러그인


3

더하다

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

Android.mk로


2
왜? 이 답변이 질문자에게 왜 효과가 있는지 설명하십시오.
L0j1k

1

이것은 나를 위해 도움이되었습니다.

Android.mk

    LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := nativeDemo
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

0

Android 스튜디오 버전 2.2 이상에서는 새 프로젝트를 만들 때 CPP에 대한 지원이 내장되어 있습니다. 또한 liblog.so가 기본적으로 포함됩니다. 헤더 파일 (android / log.h)을 포함하는 것 외에는 할 일이 없습니다.

새 Android 스튜디오 프로젝트를 만들 때 스튜디오에서 만든 app / CMakeLists.txt를 확인합니다. loglib에 대한 find_library () 블록과 target_link_libraries () 블록이 이미 존재하는 것을 볼 수 있습니다.

또한 함수 구문에주의하십시오. 그것은해야한다:

__android_log_print (int 우선 순위, const char * tag, const char * fmt, ...);

제 경우에는 태그 매개 변수를 생략하고이를 파악하는 데 3 일을 보냈습니다.

CMake에 대한 추가 정보 : 프로젝트에 C 및 C ++ 코드 추가



0

LOCAL_SHARED_LIBRARIES:= liblog Android.mk에 추가 하면 내 isuue를 해결할 수 있습니다. 이는 __android_log_printlibLog에 정의되어 있기 때문입니다.


0

Android.bp로 빌드하려면 아래 솔루션을 따르십시오.

여기 에서 android_log_print 는 NDK에 정의되어 있으므로 이미 사용 가능한 라이브러리가 있습니다. shared_libs 태그를 사용하여 " liblog "라이브러리를 사용 하고 아래 코드를 참조하십시오.

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.