GNU/Linux >> Znalost Linux >  >> Linux

Podivný název symbolu ve výstupu příkazu nm

Je to kvůli změně názvu C++

nm -C

zničí je.

Chcete-li zabránit pozměnění názvu,

  • použijte kompilátor jazyka C (gcc, nikoli g++), pojmenujte zdrojový soubor .c (ne .cpp)
  • nebo deklarujte externí "C":

.

my.h

  extern "C" 
  {
        void start();
        void finish();
  }

To jim dá vazbu "C", což znamená, že nemohou být přetíženy, nemohou projít odkazem, nic c++ :)


Zní to jako změna názvu C++.


Jak již bylo zmíněno v jiných odpovědích, je to pravděpodobně kvůli změně názvu C++. Pokud chcete, aby byl symbol přístupný pod jeho „nezkomoleným“ názvem a je implementován v C++, budete potřebovat extern "C" sdělit kompilátoru C++, že má vazbu C.

V záhlaví, které má prototyp funkce, budete chtít něco jako:

#if defined(__cplusplus)
extern "C" {
#endif

// the prototype for start()...


#if defined(__cplusplus)
}
#endif

To zajistí, že pokud je funkce používána kompilátorem C++, dostane extern "C" na deklaraci a že pokud je používán modulem C, nebude zmaten extern "C" specifikátor.

Vaše implementace v souboru .cpp tyto věci nepotřebuje, pokud zahrnete hlavičku před definicí funkce. Použije specifikaci propojení, kterou viděl z předchozí deklarace. Dávám však přednost ještě ozdobit definici funkce pomocí extern "C" jen aby bylo zajištěno, že je vše synchronizováno (všimněte si, že v souboru .cpp nepotřebujete #ifdef předzpracování – vždy bude kompilováno jako C++.


Linux
  1. Ukládání výstupu příkazu do proměnné Shell?

  2. Převést výstup příkazu stromu do formátu Json?

  3. Výstup kterého příkazu použitého pro vstup na CD?

  1. Jak uložit výstup příkazu do souboru v Linuxu

  2. Rozhraní příkazového řádku C++

  3. Převeďte výstup na řetězec

  1. Výstup „posledního“ příkazu?

  2. Příklady příkazů času Linux

  3. 10 Praktické příklady příkazů Linux nm