Linux c++ 오류: 'dlopen'에 대한 정의되지 않은 참조
저는 리눅스에서 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
이해하는데 시간이 좀 걸렸어요...
이것은 작동하지 않습니다.
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
끝나고-
(stdin 인수 기호).
프로젝트를 컴파일하기 위해 CMake를 사용하고 있었는데 동일한 문제를 발견했습니다.
여기에 설명된 솔루션은 매력적으로 작동합니다. target_link_libraries() 호출에 ${CMAKE_DL_LIBS}를 추가하기만 하면 됩니다.
이 주제는 꽤 오래되었지만, 저는 오늘 cegui 0.7.1(openVibe 전제 조건)을 컴파일하는 동안 같은 문제로 어려움을 겪었습니다.
제게 효과가 있었던 것은 다음과 같습니다.LDFLAGS="-Wl,--no-as-needed"
Makefile에 있습니다.
저도 해봤어요.-ldl
위해서LDFLAGS
하지만 소용이 없습니다.
당신은 이것을 추가할 수 있습니다.
LIBS=-ldl CFLAGS=-fno-strict-aliasing
구성 옵션으로
메이크 파일에 대해 다음과 같은 작업을 수행해야 했습니다.
LDFLAGS='-ldl'
make install
그렇게 하면 링커 플래그가 메이크에서 링커로 전달됩니다.메이크 파일이 자동 생성되었는지 여부는 중요하지 않습니다.
사용하면서도 동일한 문제에 직면했습니다.-ldl
.
이 옵션 외에도 소스 파일은 라이브러리 앞에 배치해야 합니다. 'dlopen'에 대한 정의되지 않은 참조를 참조하십시오.
dl 함수를 사용하려면 링커에 -ldl 플래그를 사용해야 합니다.
일식 때는 어떻게 합니까?
프로젝트 --> 속성 --> C/C++ 빌드 --> 설정 --> GCC C++ 링커 -->
라이브러리 --> "라이브러리(-l)" 상자에서 "+" 기호 --> "dl"을 누릅니다(따옴표 없이). -> ok --> 프로젝트 정리 및 재구성.
$gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols>
하지만 $mangcc의 문서에도 꽤 간결한 설명이 있습니다.
-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.
플래그를 사용하여 openssl(연결 중인 경우)을 다시 작성해 보십시오.no-threads
.
그런 다음 다음과 같이 연결해 보십시오.
target_link_libraries(${project_name} dl pthread crypt m ${CMAKE_DL_LIBS})
GNU 도구 체인의 이전 버전(~2.7)에서 glibc는 링크 로더(dlopen 및 dlsym 함수)에 대한 직접 인터페이스가 없었기 때문에 컴파일 시 -ldl(libdl)을 제공해야 했습니다.최신 glibc 버전으로 더 이상 그럴 필요가 없습니다.<dlcfn>만 포함하면 됩니다.그리고 당신은 가도 좋습니다.
언급URL : https://stackoverflow.com/questions/956640/linux-c-error-undefined-reference-to-dlopen
'code' 카테고리의 다른 글
Git Stash를 원격 저장소에 푸시할 수 있습니까? (0) | 2023.05.08 |
---|---|
VB를 사용하여 'where' 절을 추가하려면 어떻게 해야 합니까?NET과 LINQ? (0) | 2023.05.08 |
ASP.NET 웹 API - PUT & DELETE 동사 허용 안 됨 - IIS 8 (0) | 2023.05.03 |
폴더의 파일 이름을 순차 번호로 변경 (0) | 2023.05.03 |
두 배열을 에서 병합하는 중입니다.그물 (0) | 2023.05.03 |