লিনাক্স সি ++ ত্রুটি: 'ড্লোপেন' এর অপরিবর্তিত রেফারেন্স


147

আমি লিনাক্সে সি ++ (এক্লিপস) দিয়ে কাজ করি এবং একটি লাইব্রেরি ব্যবহার করতে চাই। গ্রহণ আমাকে ত্রুটি দেখায়:

undefined reference to 'dlopen' 

আপনি কি সমাধান জানেন?

আমার কোডটি এখানে:

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) {
    void *handle;
    double (*desk)(char*);
    char *error;

    handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY);
    if (!handle) {
        fputs (dlerror(), stderr);
        exit(1);
    }

    desk= dlsym(handle, "Apply");

    if ((error = dlerror()) != NULL)  {
        fputs(error, stderr);
        exit(1);
    }

    dlclose(handle);
}

উত্তর:


254

আপনাকে লিডডিলের সাথে লিঙ্ক করতে হবে, যোগ করতে হবে

-ldl

আপনার লিঙ্কার বিকল্পে


2
আমি একই সমস্যায় পড়েছি ... আমি প্রকল্প> বৈশিষ্ট্য> সি / সি ++ বিল্ড> সেটিংস> (আমার লিঙ্কার)> লিঙ্কার পতাকাগুলি পাঠ্য ক্ষেত্রে বিবিধের অধীনে সংকলক পতাকা যুক্ত করেছি। এটা কিছুই করেনি।
মিররফেটে

3
হ্যাঁ, ঠিক আছে, অন্য কারও কাছেও এই সমস্যা রয়েছে তার জন্য উপরের পাথটি ব্যবহার করুন, বিযুক্তির চেয়ে লাইব্রেরিগুলিতে না গিয়ে 'ডিএল' যোগ করুন
মিররফেটে

2
এই উত্তর সাহায্য করেছে। যে কেউ libdl.so এর অবস্থান সন্ধান করতে চান, তার জন্য কেবল মূল ডিরেক্টরিতে যান এবং টাইপ করুনlocate libdl.so
নভ

মিররফেটের উত্তর আমার পক্ষেও কাজ করেছিল। আমি বুঝতে পারি না কেন, যদিও; বিবিধ জায়গায় রাখার সময় আমার অন্য যে কোনও লাইব্রেরির সাথে লিঙ্ক করতে হয়েছিল।
সমষ্টি

75

@ মাস্কি সঠিক, তবে আপনি সি ব্যবহার করছেন (এবং gccসংকলক) অ্যাকাউন্টটি বিবেচনা করুন যে এটি কাজ করে না:

gcc -ldl dlopentest.c

তবে এটি করে:

gcc dlopentest.c -ldl

আমাকে বের করার জন্য কিছুটা সময় নিলেন ...


2
আমি খুঁজে পেয়েছি যে বিকল্পগুলির ক্রমটিও গুরুত্বপূর্ণ। স্ক্লাইট 3 ব্যবহার করে একটি প্রকল্পে, আমাকে -ldl (এবং -pthread) -lqlite3 এর পরে লাগাতে হবে। কী তা জানেন না, আমি নিশ্চিত আরটিএফএম করলে উত্তরটি অবশ্যই আছে।

পবিত্র বোকা, এটাই! আমি কখনই অনুমান করতে পারতাম না যে বিকল্পগুলি প্রথমে রাখার (যা আমার কাছে আরও বোঝায়) কাজ করে না, যখন সেগুলি করার পরে। ধন্যবাদ, @ ননকোটে!
জো স্ট্রাউট

@ ব্যবহারকারী 2918461 মাথায় পেরেকটি আঘাত করলেন। আমাকে "এল" সঠিক "ক্রমে রাখতে হয়েছিল।
এনডিডিথোস

হ্যাঁ, ভাল
লাগল, তবে

8

বিষয়টি বেশ পুরানো, তবুও সেগুই ০.০.১ (ওপেনবিব পূর্বশর্ত) সংকলন করার সময় আমি আজ একই সমস্যার সাথে লড়াই করেছি।

আমার জন্য যা কাজ করেছিল তা সেট করা ছিল: LDFLAGS="-Wl,--no-as-needed" মেকফাইলে।

আমিও চেষ্টা করেছি -ldlজন্য LDFLAGSকিন্তু কোন উপকার।


8

এটি কাজ করে না:

gcc -ldl dlopentest.c

তবে এটি করে:

gcc dlopentest.c -ldl

এটি অবশ্যই বিরক্তিকর একটি "বৈশিষ্ট্য"

হেরডোক সিনট্যাক্স লেখার সময় আমি এটির সাথে লড়াই করেছিলাম এবং কিছু আকর্ষণীয় তথ্য পেয়েছি । সহ CC=Clang, এটি কাজ করে:

$CC -ldl -x c -o app.exe - << EOF
#include <dlfcn.h>
#include <stdio.h>
int main(void)
{
  if(dlopen("libc.so.6", RTLD_LAZY | RTLD_GLOBAL))
    printf("libc.so.6 loading succeeded\n");
  else
    printf("libc.so.6 loading failed\n");
  return 0;
}
EOF

./app.exe

পাশাপাশি এই সমস্ত:

  • $CC -ldl -x c -o app.exe - << EOF
  • $CC -x c -ldl -o app.exe - << EOF
  • $CC -x c -o app.exe -ldl - << EOF
  • $CC -x c -o app.exe - -ldl << EOF

যাইহোক, সঙ্গে CC=gcc, শুধুমাত্র শেষ বৈকল্পিক কাজ করে; -ldlপরে -(stdin যুক্তি প্রতীক)।


5

আপনি এটি যুক্ত করার চেষ্টা করতে পারেন

LIBS=-ldl CFLAGS=-fno-strict-aliasing

কনফিগার বিকল্পগুলি


1
এলআইবিএস ভেরিয়েবলটি ব্যবহার করে কমান্ড লাইনের সঠিক জায়গায় -ldl স্থাপনের জন্য কনফিগার করার জন্য আমার পক্ষে কাজ হয়েছিল।
ডানকান

5

আমি আমার প্রকল্পটি সংকলন করতে সিএমকে ব্যবহার করছিলাম এবং আমি একই সমস্যা পেয়েছি।

সমাধান বর্ণনা এখানে একটি যাদুমন্ত্র মত কাজ করে, কেবল $ {CMAKE_DL_LIBS} target_link_libraries করার জন্য (কল যোগ করুন)


1
ধন্যবাদ! এটি আমাকেও সহায়তা করেছিল। তবে আমি আমার সংকলকটি ঝনঝনিতে পরিবর্তিত হওয়ার পরেই SET(CMAKE_CXX_COMPILER /usr/bin/clang++)। আমার উবুন্টুতে / ইউএসআর / বিন / সি ++ দিয়ে এটি কাজ করছিল না ... (ভলকান রাভেনের উত্তরও দেখুন)
থোমাসফের্মী

3

মেকফিলের জন্য আপনাকে এরকম কিছু করার দরকার ছিল:

LDFLAGS='-ldl'
make install

এটি লিঙ্কারের পতাকাগুলি মেকিং থেকে লিঙ্কারের মধ্যে দিয়ে যাবে। মেকফাইলটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছিল তা বিবেচ্য নয়।



1

Dl ফাংশন ব্যবহার করার জন্য আপনাকে লিঙ্কারের জন্য -ldl পতাকা ব্যবহার করতে হবে।

আপনি কিভাবে এটি গ্রহণ করবেন?

প্রকল্প টিপুন -> বৈশিষ্ট্য -> সি / সি ++ বিল্ড -> সেটিংস -> জিসিসি সি ++ লিংকার ->
লাইব্রেরি -> "লাইব্রেরি (-লি)" বাক্সে "+" সাইন -> লিখুন টিপুন " ডিএল " (উদ্ধৃতি ব্যতীত) -> চাপুন ঠিক আছে -> আপনার প্রকল্পটি পরিষ্কার করুন এবং পুনর্নির্মাণ করুন।


1
 $gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols>

-L dl প্লেসমেন্ট কেন গুরুত্বপূর্ণ তার একটি ভাল বর্ণনা

তবে ম্যান জিসিসি থেকে ডক্সে একটি সুন্দর পারস্পরিক ব্যাখ্যা রয়েছে

   -llibrary
   -l library
       Search the library named library when linking.  (The second
       alternative with the library as a separate argument is only for POSIX
       compliance and is not recommended.)
       It makes a difference where in the command you write this option; the
       linker searches and processes libraries and object files in the order
       they are specified.  Thus, foo.o -lz bar.o searches library z after
       file foo.o but before bar.o.  If bar.o refers to functions in z,
       those functions may not be loaded.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.