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);
}
Libdlに対してリンクする必要があり、追加する
-ldl
リンカーオプション
@Masciは正しいですが、C(およびgcc
コンパイラ)を使用している場合は、これが機能しないことを考慮してください。
gcc -ldl dlopentest.c
しかし、これは:
gcc dlopentest.c -ldl
少し理解してくれました...
トピックはかなり古いですが、cegui 0.7.1(openVibeの前提条件)のコンパイル中に、今日同じ問題に苦労しました。
MakefileでLDFLAGS="-Wl,--no-as-needed"
を設定することは私にとってうまくいきました。
-ldl
for LDFLAGS
も試しましたが、役に立ちませんでした。
これを追加してみることができます
LIBS=-ldl CFLAGS=-fno-strict-aliasing
構成オプションへ
Makefileに対して次のようなことをする必要がありました。
LDFLAGS='-ldl'
make install
これにより、リンカーフラグがmakeからリンカーに渡されます。メイクファイルが自動生成されたかどうかは関係ありません。
これは機能しません:
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
の後の-
(標準入力引数シンボル)。
私はCMakeを使用してプロジェクトをコンパイルしていましたが、同じ問題が見つかりました。
説明されているソリューション here はチャームのように機能し、単に$ {CMAKE_DL_LIBS}をtarget_link_libraries()呼び出しに追加します
-ldl
を使用しても同じ問題に遭遇しました。
このオプションに加えて、ソースファイルはライブラリの前に配置する必要があります。 「dlopen」への未定義参照 を参照してください。
Dl関数を使用するには、リンカーに-ldlフラグを使用する必要があります。
eclipseでどのようにそれをしますか?
Project->Properties->C/C++ build-を押します->Settings->GCC C++ Linker->
ライブラリ-> [ライブラリ(-l)]ボックスで[+]記号を押します- -> "dl"(引用符なし)->ok->cleanを押しますプロジェクトを再構築します。
$gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols>
しかし、ドキュメントにはかなり簡潔な説明もあります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.