GNU/Linux >> Znalost Linux >  >> Linux

Chyba Linux c++:nedefinovaný odkaz na 'dlopen'

Musíte odkazovat proti libdl, add

-ldl

k vašim možnostem linkeru


Ke kompilaci svého projektu jsem používal CMake a našel jsem stejný problém.

Zde popsané řešení funguje jako kouzlo, jednoduše přidejte ${CMAKE_DL_LIBS} do volání target_link_libraries()


@Masci je správně, ale v případě, že používáte C (a gcc kompilátor) vezměte v úvahu, že to nefunguje:

gcc -ldl dlopentest.c

Ale tohle:

gcc dlopentest.c -ldl

Trochu mi trvalo, než jsem na to přišel...


toto nefunguje:

gcc -ldl dlopentest.c

Ale tohle:

gcc dlopentest.c -ldl

To je jistě jedna nepříjemná "funkce"

Při psaní syntaxe heredoc jsem s tím bojoval a našel jsem pár zajímavých faktů . S CC=Clang , funguje to:

$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

stejně jako všechny tyto:

  • $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

Nicméně s CC=gcc , funguje pouze poslední varianta; -ldl po - (symbol argumentu stdin).


Linux
  1. Dynamická sdílená knihovna C++ v systému Linux

  2. Chyba C++:nedefinovaný odkaz na 'clock_gettime' a 'clock_settime'

  3. C++/Assembly IDE v Linuxu

  1. Detekce Windows nebo Linuxu v C, C++

  2. C++ Boost:nedefinovaný odkaz na boost::system::generic_category()

  3. Makro IS_ERR() v Linuxu

  1. cp:vynechání adresáře – chyba při kopírování adresáře v Linuxu

  2. Chyba na Vagrant Up na Linuxu

  3. copy_to_user nedefinováno v linuxovém jádře verze 4.12.8