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


147

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

回答:


254

libdlにリンクし、追加する必要があります

-ldl

あなたのリンカーオプションに


2
同じ問題が発生しました...プロジェクト>プロパティ> C / C ++ Build>設定>(マイリンカー)>その他のリンカーフラグテキストフィールドのコンパイラフラグを追加しました。それは何もしませんでした。
MirroredFate 2013

3
ハ、そう、この問題を抱えている他の人は、上記のパスを使用してください。ただし、MiscellaneousではなくLibrariesに移動して「dl」を追加します
MirroredFate

2
この答えは役に立ちました。libdl.soの場所を見つけたい人のために、単にルートディレクトリに移動し、入力locate libdl.so
Navの

MirroredFateの答えも私にとってうまくいきました。理由はわかりませんが。その他に配置したときにリンクする必要があった他のすべてのライブラリは機能しました。
aggregate116​​6877 14

75

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

gcc -ldl dlopentest.c

しかし、これは:

gcc dlopentest.c -ldl

少し理解して...


2
オプションの順序も重要であることがわかりました。sqlite3を使用するプロジェクトでは、-lsqlite3の後に-ldl(および-lpthread)を配置する必要があります。それが何なのかわからない。RTFMだけで答えが得られると確信している。

聖なるがらくた、それだけです!オプションを最初に配置すること(これは私にとってより理にかなっています)が機能せず、後に配置することはできないとは思いもしませんでした。@knocteありがとうございます!
ジョーストラウト2017

@ user2918461が頭に釘を打ちました。-lを「正しい」順序に並べる必要がありました。
NDEthos 2017年

ええ、いいですが、できるだけ多くの人々をタイムリーに助けるために答えを書くことの優先順位ではありません
knocte

8

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

私のために働いたのLDFLAGS="-Wl,--no-as-needed" は、Makefileで設定することでした。

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


8

これは機能しません:

gcc -ldl dlopentest.c

しかし、これは:

gcc dlopentest.c -ldl

それは確かに1つの迷惑な「機能」です

ヒアドキュメントの構文を書いているとき、私はそれに苦労していて、興味深い事実を見つけました。で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
LIBS変数を使用すると、configureで-ldlをコマンドラインの適切な場所に配置できました。
ダンカン2015年

5

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

ここで説明するソリューションはチャームのように機能し、$ {CMAKE_DL_LIBS}をtarget_link_libraries()呼び出しに追加するだけです


1
ありがとう!これも私を助けました。しかし、コンパイラをclangに変更した後でのみSET(CMAKE_CXX_COMPILER /usr/bin/clang++)。Ubuntuで/ usr / bin / c ++を使用すると、動作しませんでした...(バルカンレイヴンの回答も参照)
thomasfermi

3

あなたはmakefileに対してこのようなことをする必要がありました:

LDFLAGS='-ldl'
make install

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



1

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

あなたはそれを日食でどのように行うのですか?

プレスプロジェクト - > プロパティ - > C / C ++ビルド - > [設定] - > [ GCC C ++リンカ - >
ライブラリ - > "ライブラリ(-l)"ボックスで押して"+"記号 - >書き込み" dl "(引用符なし)-> okを押します-> プロジェクトを削除して再構築します。


1
 $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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.