2016-09-13 41 views
5

Mam funkcję zdefiniowaną w pliku .c (słownie funcs.c):nierozwiązywalne symbol 'name' odwołuje się wypowiedzi

void *funName() 
{ 
    //implementation 
} 

i skompilowany do biblioteki (libname.so).

A ja kompilacji innego .c pliku (main.c), który korzysta z tej funkcji, a ja ustawiania nazw symboli w linii poleceń:

gcc -Wl,--just-symbols=symbolsfile.txt main.c -o main -lname 

symbolsfile.txt:

FunSym = funName;
Symbol2 = expression2;
...

ale dostaję ten błąd: łączenie

symbolsfile.txt:1: unresolvable symbol 'funName' referenced in expression
symbolsfile.txt:2: unresolvable symbol 'expression2' referenced in expression
collect2.exe: error: ld returned 1 exit status

Próbowałem dodać deklarację funkcji w funcs.c (nie mam odpowiedniego pliku .h), ale to się nie zmieniło.

Jeśli zmienię FunSym = funName do FunSym = garbage, zmiany błędu do „niezdefiniowany symbol ...”, więc myślę, że wyrażenie funName znaleziono.

Aktualizacja:

Próbowałem dodanie extern void *funName(); na szczycie main.c lub w osobnym pliku nagłówka jako sugerowane w komentarzach, ale to nie rozwiązało problemu (sam błąd). Czy flaga --just-symbols musi być dodana podczas kompilowania/kompilowania biblioteki (libname.so)?

+0

masz plik nagłówka z interfejsem do udostępnionego lib? Czy lib jest dostępny: może musisz dodać opcję '-L'? – LPs

+0

'-lname.so' ->' -lname' – LPs

+0

@LPs Tak, to literówka w poście (naprawiona teraz). Właściwie to piszę "-lname". I tak, jest osiągalny. (Mam '-L') –

Odpowiedz

1

Przenieś flagę --just-symbols z kompilowania main.c w celu połączenia biblioteki. Więc skompilować bibliotekę takiego:

gcc -g -Wl,--just-symbols=symbolsfile.txt -shared -o libname.so *.o 

i main.c takiego:

gcc main.c -o main -lname