Sto costruendo una libreria condivisa (chiameremo "pippo") che fa uso di un'altra libreria (la chiameremo "barra"). "bar" utilizza alcune funzioni di OpenSSL.Errori che si riferiscono a una serie di simboli OpenSSL irrisolti che esistono chiaramente?
Ecco dove si presenta il problema.
"bar" è stato compilato come libreria statica e sembrerebbe che fosse OpenSSL. Così, quando ho linkare la libreria ("foo"), includo il:
- file oggetto per "foo"
- libreria statica
libbar.a
- OpenSSL librerie statiche
libcrypto.a
elibssl.a
Il il comando di compilazione ha un aspetto simile al seguente:
g++ -Wl,-soname,libfoo.so -shared file1.o file2.o libbar.a \
libcrypto.a libssl.a -o libfoo.so
Tuttavia, Ho un sacco di errori:
ld: ./obj/libbar.a(file1.c.o): in function initialize_openssl:
ssl.c:117: error: undefined reference to 'SSL_library_init'
eseguendo il comando seguente:
nm libssl.a | grep SSL_library_init
produce il seguente output:
00000000 T SSL_library_init
Così, ovviamente, non c'è niente di sbagliato con le librerie OpenSSL. Cosa potrebbe aver causato qualcosa di simile? Ecco i tre comandi utilizzati per costruire OpenSSL:
export cross=arm-linux-androideabi-
./Configure android --prefix=~/openssl-arm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
Il processo di compilazione completato senza errori, quindi sono assolutamente sconcertato.
Perché ricevo errori di linker che si riferiscono a una serie di simboli OpenSSL che esistono chiaramente?
Sto indovinando perché il compilatore/linker apprende i simboli in un ordine lineare e se si verifica una condizione di fuori servizio, allora barfs. Potrebbe anche essere inversamente lineare (anticipando la barra a seconda di foo e le tue costruzioni di dipendenza costruite all'indietro). – RobotHumans