[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로 전달합니다. 메이크 파일이 자동 생성 된 것은 중요하지 않습니다.