nyní z toho, co vidím, je příkaz
-l + filename
, například můj název souboru jedirectory/libtest.so
bylo by to-ldirectory/libtest.so
Ne, to není správné. Mělo by to být -Ldirectory -ltest
tj. používáte -L
přidat adresář do vyhledávacích cest, kde bude linker hledat knihovny, a vy řeknete, na které knihovny se má odkazovat pomocí -l
, ale pro odkaz na libtest.so
nebo libtest.a
řeknete -ltest
bez lib
prefix nebo příponu souboru.
můžete odkaz explicitním pojmenováním souboru bez -L
nebo -l
možnosti, tj. jen directory/libtest.so
, ale u dynamických knihoven je to téměř vždy nesprávná věc, protože vkládá přesnou cestu do spustitelného souboru, takže stejná knihovna musí být při spuštění programu na stejném místě. Obvykle se na ni chcete propojit jménem (ne cestou), aby knihovnu s tímto názvem bylo možné používat z libovolného umístění za běhu.
Toto je postup krok za krokem, jak vytvořit a propojit soubor .so se souborem .cpp
-
Vytvořte soubor .cpp, který chcete převést na .so.
Příklad -
#include<stdio.h> int add(int a , int b) { return a+b;}
Uložte jej pod názvem add.cpp
-
Vytvořte .so pomocí následujícího příkazu
gcc -c -fPIC add.cpp -o add.o
Tím se vytvoří libadd.so
-
Vytvořte soubor .cpp, který bude používat tento soubor .so
Příklad-
#include<stdio.h> extern int add(int a, int b); int main(int argc, char** argv) { printf("Hello the output is %d \n",add(10,15)); return 0; }
Uložte jej jako main_file.cpp
-
Pomocí tohoto příkazu vytvořte z tohoto souboru soubor .o
g++ -c main_file.cpp
-
Propojte .so s .o pomocí tohoto příkazu
g++ -o prog main_file.o -L. -ladd
Zde L určuje složku se souborem .so
A -l určuje název knihovny .so -
Spusťte program pomocí příkazu
./prog