code

Linux c++ 오류: 'dlopen'에 대한 정의되지 않은 참조

starcafe 2023. 5. 8. 22:21
반응형

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>

-ldl의 배치가 중요한 이유에 대한 설명

하지만 $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

반응형