web-dev-qa-db-ja.com

Linux C ++エラー: 'dlopen'への未定義の参照

LinuxでC++(Eclipse)を使用していますが、ライブラリを使用したいです。 Eclipseは私にエラーを示します:

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);
}
128
user101375

Libdlに対してリンクする必要があり、追加する

-ldl

リンカーオプション

230
Masci

@Masciは正しいですが、C(およびgccコンパイラ)を使用している場合は、これが機能しないことを考慮してください。

gcc -ldl dlopentest.c

しかし、これは:

gcc dlopentest.c -ldl

少し理解してくれました...

60
knocte

トピックはかなり古いですが、cegui 0.7.1(openVibeの前提条件)のコンパイル中に、今日同じ問題に苦労しました。

MakefileでLDFLAGS="-Wl,--no-as-needed"を設定することは私にとってうまくいきました。

-ldl for LDFLAGSも試しましたが、役に立ちませんでした。

7
bawey

これを追加してみることができます

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

構成オプションへ

4
user2948547

Makefileに対して次のようなことをする必要がありました。

LDFLAGS='-ldl'
make install

これにより、リンカーフラグがmakeからリンカーに渡されます。メイクファイルが自動生成されたかどうかは関係ありません。

3
Rob

これは機能しません:

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の後の-(標準入力引数シンボル)。

3
vulcan raven

私はCMakeを使用してプロジェクトをコンパイルしていましたが、同じ問題が見つかりました。

説明されているソリューション here はチャームのように機能し、単に$ {CMAKE_DL_LIBS}をtarget_link_libraries()呼び出しに追加します

2
Lucas Coelho

-ldlを使用しても同じ問題に遭遇しました。

このオプションに加えて、ソースファイルはライブラリの前に配置する必要があります。 「dlopen」への未定義参照 を参照してください。

1
Deqing

Dl関数を使用するには、リンカーに-ldlフラグを使用する必要があります。

eclipseでどのようにそれをしますか?

Project->Properties->C/C++ build-を押します->Settings->GCC C++ Linker->
ライブラリ-> [ライブラリ(-l)]ボックスで[+]記号を押します- -> "dl"(引用符なし)->ok->cleanを押しますプロジェクトを再構築します。

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

-l dlの配置が重要な理由の適切な説明

しかし、ドキュメントにはかなり簡潔な説明もありますFrom $ man 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.
1
flerb