`__অ্যান্ড্রয়েড_লগ_প্রিন্ট 'এর অপরিবর্তিত রেফারেন্স


100

আমার মেক ফাইলটিতে কী ভুল?

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-build

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

উত্তর:


89

আপনার Android.mkফাইলে নিম্নলিখিতটি ব্যবহার করে দেখুন :

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

4
এটি যুক্ত করার জন্য কী প্রয়োজন? আপনি দয়া করে বিস্তারিত ব্যাখ্যা করতে পারেন?
ধসনীম

এটি মেক ফাইলে একটি অ্যান্ড্রয়েড লাইব্রেরি যুক্ত করছে - এবং এটি আমার জন্যও কাজ করেছে
ঘিজে

9
-L অপ্রয়োজনীয়। পরিবর্তে অন্য উত্তর গ্রহণ করুন।
জেফ অ্যালেন

5
অ্যান্ড্রয়েড স্টুডিও ১.৩ এ নতুন গ্রেডল এনডিকে ইন্টিগ্রেশন ব্যবহার করা হলে ldLibs = ["android", "log"]আপনাকে আপনার android.ndk বিকল্পগুলিতে যুক্ত করতে হবে
স্টিফেন কায়সার

4
যদি আমরা অ্যান্ড্রয়েড.এমকে ব্যবহার না করি তবে কী হবে?
ক্যাগডাস

100

আপনি যোগ করা প্রয়োজন

LOCAL_LDLIBS := -llog

Android.mk এ


4
সঠিক যদি একাধিক গ্রন্থাগার থাকে তবে তাদের প্রত্যেকের জন্য এই বিবৃতিটি যুক্ত করতে হবে (
ক্লিয়ার ওয়ারের

86

আপনি যদি অ্যান্ড্রয়েড স্টুডিও এবং গ্রেড ব্যবহার করেন তবে এটি Android.mk উপেক্ষা করে। এটি আপনার বিল্ড.gradle ফাইলটিতে যুক্ত করুন:

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

7
আমি যেখানে এটি নথিবদ্ধ আশ্চর্য। আমি এটিও খুঁজছিলাম
র্যান্ডি সুগিয়ান্তো 'ইউকু'

4
আমি যুক্ত করার আগে "'__android_log_print' - এর অনির্ধারিত রেফারেন্স পাচ্ছিলাম ldLibs। ধন্যবাদ
ডেনিস নাইয়াশেভ

4
এটি যুক্ত করা আমার জন্য এটি স্থির করে। প্রকল্প ফোল্ডারের (মডিউল নাম) এর পরিবর্তে ফোল্ডারের ndkঅভ্যন্তরে বিল্ড.রেডল অংশটি যুক্ত করার বিষয়টি নিশ্চিত করুন app
ম্যাথিয়াস

গ্রেডল 2.5 হিসাবে 'ldLibs + = "লগ"' সামান্য বাক্য গঠন পরিবর্তন ব্যবহার করুন
Lorne K

15
এটি আমার পক্ষে কাজ করে নি। এটিই আমার করতে হয়েছিল:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ

30

অ্যান্ড্রয়েড স্টুডিও ২.২ এবং সরঞ্জামগুলির জন্য: বিল্ড করুন: গ্রেডের অধিকারসমূহ ২.০ সিএমকেস্টলিস্ট.টেক্সটে সিএমকে যুক্ত করুন বা সম্পাদনা করুন:

target_link_libraries(<your_library_name> 
                      android 
                      log)

আপনার সাথে লগ লাইব্রেরি সংযোগ স্থাপন করে।


16

যদি আপনি অ্যান্ড্রয়েড স্টুডিও ২.১ এ আপগ্রেড করেন তবে উপরের উত্তরগুলি কাজ করে না, নীচের মতো লিবটি লোড করতে ldLibs.add () ব্যবহার করতে হবে:

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

সেরা আধুনিক (2017 সালের শেষের দিকে) উত্তর
এডগার অ্যার্টিওনিয়ান

7

আমরা 3 টি উপায়ে অ্যান্ড্রয়েডে একটি ভাগ করা লাইব্রেরি লিঙ্ক করতে পারি। 3 টির নীচে, উল্লিখিত লাইনগুলি যুক্ত করা উচিতAndroid.mk

সুতরাং এখানে তিনটি উপায়।

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

কোনও কারণে যদি 1 কাজ করে না (এটি আমার পক্ষে কাজ করে না), আপনি 2 টি উপায় নীচে চেষ্টা করতে পারেন

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

অবশ্যই আপনাকে #include <android/log.h> আপনার সি / এইচ ফাইলে অন্তর্ভুক্ত করতে হবে।


6

আপনি যে প্রকল্পে কাজ করছেন তাতে নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে যা অন্যান্য 'স্ট্যান্ডার্ড' উত্তরের চেয়ে পৃথক:

  • অ্যান্ড্রয়েড স্টুডিও ব্যবহার করছেন না
  • গ্রেড এবং সংহত সিএমকে ব্যবহার না করা using
  • কোনও Android.mk বা অ্যাপ্লিকেশন.এমকে বিল্ডের জন্য মোটেই ব্যবহৃত হয়নি used
  • সরাসরি সিএমকে এবং টুলচেন ব্যবহার করা (সম্ভবত আপনার প্রকল্পটি Qt ভিত্তিক এবং QtCretor ব্যবহার না করে)

নিম্নলিখিত টার্গেট_লিঙ্ক_লাইব্রিজ ব্যবহারগুলি এটি করে:

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

হচ্ছে TARGET_NAMEনা (এর সাথে সামনে থাকার এটি সেট আপ নির্মাণের লক্ষ্য নাম add_libraryবা add_executable)।

find_libraryসঠিকভাবে সরঞ্জামচেন সেটআপ করার পাশাপাশি সমানভাবে গুরুত্বপূর্ণ (অ্যান্ড্রয়েড এসডিকে সরবরাহিত টুলচেনটি ব্যবহার করুন ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakeযাতে এটি সেট আপ করে CMAKE_SYSROOTযা find_কমান্ড দ্বারা ব্যবহৃত হয় )।


একমাত্র সমাধান যা আমাকে সাহায্য করেছিল! ধন্যবাদ একটি টন, আমি এটা একটি পরীক্ষা দ্বারা প্রসারিত করবে লাইব্রেরিটি এখানে যেমন ডেভেলপার ভাল প্রতিক্রিয়া পাওয়া যায় নি stackoverflow.com/a/37868829/10030695
ManuelTS

4

হ্যাঁ, আপনাকে যুক্ত করতে হবে: LOCAL_LDLIBS := -llogঅন্যান্য উত্তরগুলি / মন্তব্যগুলি যেমন নির্দিষ্ট করেছে তবে মূল প্রশ্নটি উল্লেখ করা হয়নি যে তিনি জনি লাইব্রেরিটি: LOCAL_JNI_SHARED_LIBRARIESবা হিসাবে ব্যবহার করেন কিনা LOCAL_REQUIRED_MODULES

আমি নিশ্চিতভাবেই বলতে পারি যে তিনি এটি এটি ব্যবহার করেছেন যেমন: প্রশ্নটিতে ... LOCAL_REQUIRED_MODULESকারণ এটি LOCAL_EXPORT_LDLIBS := -llogসম্পাদনার পরে যুক্ত না করা হয়।

আপনি যদি LOCAL_REQUIRED_MODULESভাগ করা লাইব্রেরি ব্যবহার করেন তবে এপিএকের পরিবর্তে / system / lib এ ইনস্টল করা আছে, কারণ এটি একটি প্রয়োজনীয় মডিউল। সুতরাং আপনাকে LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogকেবল পরিবর্তে যুক্ত করতে হবে LOCAL_LDLIBS := -llogযাতে যখন বিল্ড সিস্টেমটি নির্মাণ এবং জেনি শেয়ার করা লাইব্রেরিটির সাথে সংযোগ স্থাপন করবে তখন এর -llogসংজ্ঞাটি সঠিক জায়গায় পাওয়া যাবে, যার অধীনে নির্মাণের জন্য উপলব্ধ $OUT/root/system/lib। অন্যথায় আপনি কেবল যুক্ত করলেও আপনি একই উত্তর পেতে থাকবেন LOCAL_LDLIBS := -llog

সুতরাং, যারা মন্তব্য করেছেন যে -Lএটির প্রয়োজন নেই, এবং অন্য উত্তরটি সঠিক ছিল, তারা আসলে এই পরিস্থিতিতে ভুল ছিল।


আসলে কী হচ্ছে তা ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ!
রিচার্ড

4

এর পরিবর্তে

অ্যান্ড্রয়েড স্টুডিও ১.৩ এ নতুন গ্রেডল এনডিকে ইন্টিগ্রেশন ব্যবহার করে, আপনার অ্যান্ড্রয়েড.অ্যান্ডক বিকল্পগুলিতে আপনাকে ldLibs = ["Android", "লগ"] যুক্ত করতে হবে - স্টিফেন কায়সার 24 সেপ্টেম্বর 4:20 এ

ldLibs.addAll(["android", "log"])পরীক্ষামূলক প্লাগইন জন্য ব্যবহার করুন


3

অ্যাড

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

Android.mk এ


4
কেন? এই উত্তরটি কেন জিজ্ঞাসকের জন্য কাজ করা উচিত দয়া করে তা ব্যাখ্যা করুন।
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

অ্যান্ড্রয়েড স্টুডিও সংস্করণ ২.২ এবং এর থেকেও বেশি, আপনি যখন নতুন প্রকল্প তৈরি করবেন তখন সিপিপির জন্য অন্তর্নির্মিত সমর্থন রয়েছে is এছাড়াও, liblog.so ডিফল্টরূপে অন্তর্ভুক্ত। শিরোনাম ফাইল (অ্যান্ড্রয়েড / লগ এইচ) অন্তর্ভুক্ত ছাড়া কিছুই করার নেই done

চেকআউট অ্যাপ / সিএমকেলিস্ট.টেক্সট যা স্টুডিওগুলি তৈরি করে যখন আমরা নতুন অ্যান্ড্রয়েড স্টুডিও প্রকল্প তৈরি করি। আমরা দেখতে পাচ্ছি যে লগলিবের জন্য ফাইন্ড_লিবারি () ব্লক এবং টার্গেট_লিঙ্ক_লাইব্রিজ () ব্লকটি ইতিমধ্যে উপস্থিত রয়েছে।

এছাড়াও, ফাংশন সিনট্যাক্সের দিকে মনোযোগ দিন। এটা করা উচিত:

__অ্যান্ড্রয়েড_লগ_প্রিন্ট (পূর্ব অগ্রাধিকার, কনস্ট চর * ট্যাগ, কনস্ট চর * এফএমটি, ...);

আমার ক্ষেত্রে, আমি ট্যাগ প্যারামিটারটি ছেড়ে দিয়েছিলাম এবং এটি বের করার জন্য ভাল 3 দিন ব্যয় করে শেষ করেছি।

সিএমকে সম্পর্কে আরও: আপনার প্রকল্পে সি এবং সি ++ কোড যুক্ত করুন


0

-ডিসিএমএএম.কে.সিএক্সএক্স_এফএলজিএস = "- লগ" আমাকে সহায়তা করে


0

LOCAL_SHARED_LIBRARIES:= liblog Android.mk এ যুক্ত করা আমার সমস্যা সমাধান করতে পারে। এটি __android_log_printলিবলগে সংজ্ঞায়িত হওয়ার কারণে


0

Android.bp দিয়ে তৈরি করতে, নীচের সমাধানটি অনুসরণ করুন:

এটিতে - অ্যান্ড্রয়েড_লগ_প্রিন্টটি এনডিকেতে সংজ্ঞায়িত করা হয়েছে, সুতরাং এর জন্য ইতিমধ্যে একটি লাইব্রেরি উপলব্ধ। " লিবলব্লগ " লাইব্রেরি শেয়ারড_লিবস ট্যাগ ব্যবহার করে নীচের কোডটি দেখুন:

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.