लिनक्स c ++ त्रुटि: 'dlopen' के लिए अपरिभाषित संदर्भ


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

आपको libdl के खिलाफ लिंक करना होगा, जोड़ना होगा

-ldl

अपने लिंकर विकल्पों के लिए


2
मैं एक ही समस्या में चला गया हूं ... मैंने प्रोजेक्ट> गुण> C / C ++ बिल्ड> सेटिंग्स> (मेरा लिंकर)> लिंकर झंडे पाठ क्षेत्र में विविध के तहत संकलक ध्वज जोड़ा। इसने कुछ नहीं किया।
मिररफाइंड

3
हा, ठीक है, किसी और के लिए, जिसमें यह समस्या है, उपरोक्त पथ का उपयोग करें, सिवाय इसके कि पुस्तकालयों में जाने के बजाय विविध और 'dl' जोड़ें
दर्पण

2
इस जवाब ने मदद की। कोई भी व्यक्ति जो libdl.so का स्थान खोजना चाहता है, बस रूट डायरेक्टरी पर जाएं और टाइप करेंlocate libdl.so
Nav

मिररफाइड के जवाब ने मेरे लिए भी काम किया। मुझे समझ नहीं आता, हालाँकि; जब मैंने लिंक किया है तो हर दूसरे पुस्तकालय को विविध में रखे जाने पर काम करना पड़ता है।
समुच्चय

75

@Masci सही है, लेकिन यदि आप C (और gccसंकलक) का उपयोग कर रहे हैं तो ध्यान रखें कि यह काम नहीं करता है:

gcc -ldl dlopentest.c

लेकिन यह करता है:

gcc dlopentest.c -ldl

मुझे थोड़ा समझ लिया ...


2
मैंने पाया है कि विकल्पों का क्रम भी मायने रखता है। Sqlite3 का उपयोग करने वाली परियोजना पर, मुझे -lsqlite3 के बाद -ll (और -lpreadread) डालना होगा। नहीं पता कि वह क्या है, मुझे यकीन है कि जवाब वहाँ है अगर मैं सिर्फ आरटीएफएम होगा।

पवित्र बकवास, यह बात है! मैंने कभी यह अनुमान नहीं लगाया होगा कि विकल्पों को पहले रखना (जो मुझे अधिक समझ में आता है) काम नहीं करता है, जबकि उन्हें करने के बाद डालते हैं। धन्यवाद, @knocte!
१18 पर जो स्ट्रेट

@ user2918461 ने सिर पर कील ठोक दी। मुझे -l के "सही" क्रम में रखना था।
NDEthos

हाँ, अच्छा है, लेकिन एक समय पर फैशन में संभव के रूप में कई लोगों की मदद करने के लिए जवाब लिखने के लिए एक प्राथमिकता नहीं है
knocte

8

विषय काफी पुराना है, फिर भी मैं सेग्युई 0.7.1 (ओपनवीब प्राइमोल्डी) का संकलन करते हुए आज उसी मुद्दे से जूझता रहा।

मेरे लिए क्या काम करना था: 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के बाद -(स्टड तर्क प्रतीक)।


5

आप इसे जोड़ने का प्रयास कर सकते हैं

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

कॉन्फ़िगर विकल्प के लिए


1
LIBS चर का उपयोग करना मेरे लिए कमांड लाइन पर सही जगह पर put -ldl को कॉन्फ़िगर करने के लिए काम करता है।
डंकन

5

मैं अपने प्रोजेक्ट को संकलित करने के लिए CMake का उपयोग कर रहा था और मुझे भी यही समस्या मिली है।

यहां वर्णित समाधान एक आकर्षण की तरह काम करता है, बस $ {CMAKE_DL_LIBS} को target_link_lbooks () कॉल में जोड़ें


1
धन्यवाद! इससे मुझे भी मदद मिली। लेकिन उसके बाद ही मैंने अपने कंपाइलर को क्लैंग में बदल दिया SET(CMAKE_CXX_COMPILER /usr/bin/clang++)। मेरे उबंटू पर / usr / bin / c ++ के साथ यह काम नहीं कर रहा था ... (वल्कन रैवेन का उत्तर भी देखें)
thomasfermi

3

मेकफाइल के लिए आपको ऐसा कुछ करने की आवश्यकता है:

LDFLAGS='-ldl'
make install

कि लिंकर झंडे के माध्यम से लिंकर बनाने के माध्यम से पारित करेंगे। इससे कोई फर्क नहीं पड़ता कि मेकफाइल को ऑटोजेनर किया गया था।



1

Dl फ़ंक्शन का उपयोग करने के लिए आपको लिंकर के लिए -ldl ध्वज का उपयोग करने की आवश्यकता होती है।

आप इसे ग्रहण में कैसे करेंगे?

प्रेस प्रोजेक्ट -> गुण -> C / C ++ बिल्ड -> सेटिंग्स -> GCC C ++ लिंकर ->
लाइब्रेरीज़ -> "लाइब्रेरीज़ (-l)" बॉक्स में "+" साइन -> राइट दबाएं " डीएल " (उद्धरण के बिना) -> ठीक दबाएं -> अपनी परियोजना को साफ और पुनर्निर्माण करें।


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

क्यों -l dl की नियुक्ति मायने रखती है का एक अच्छा विवरण

लेकिन डॉक्स में एक सुंदर रसीला विवरण $ आदमी gcc से भी है

   -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.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.