[c++] Linux C ++ 오류 : ‘dlopen’에 대한 정의되지 않은 참조
Linux에서 C ++ (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 전제 조건)을 컴파일하는 동안 오늘 같은 문제로 어려움을 겪었습니다.
나를 위해 일한 LDFLAGS="-Wl,--no-as-needed"
것은 Makefile에서 설정하는 것이 었습니다 .
나는 또한 시도했다 -ldl
위해 LDFLAGS
하지만 아무 소용.
답변
이것은 작동하지 않습니다 :
gcc -ldl dlopentest.c
그러나 이것은 :
gcc dlopentest.c -ldl
그것은 확실히 성가신 “기능”입니다
heredoc 구문을 작성할 때 어려움을 겪고 흥미로운 사실을 발견했습니다 . 를 사용하면 다음 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 인수 기호)
답변
당신은 이것을 추가하려고 할 수 있습니다
LIBS=-ldl CFLAGS=-fno-strict-aliasing
구성 옵션
답변
CMake를 사용하여 프로젝트를 컴파일하고 있었고 동일한 문제를 발견했습니다.
여기에 설명 된 솔루션은 매력처럼 작동합니다. 단순히 target_link_libraries () 호출에 $ {CMAKE_DL_LIBS}를 추가하십시오.
답변
makefile을 위해 다음과 같은 작업을 수행해야했습니다.
LDFLAGS='-ldl'
make install
링커 플래그를 make에서 linker로 전달합니다. 메이크 파일이 자동 생성 된 것은 중요하지 않습니다.