Domanda

Sto lavorando in un ambiente Linux con C ++, usando il compilatore GCC.

Attualmente sto lavorando alla modifica e all'aggiornamento di un ampio corpus di codice preesistente. Come parte di questo, è stato necessario aggiungere un numero piuttosto elevato di piccoli riferimenti in tutto il codice in una varietà di luoghi per collegare le cose insieme, e anche aggiungere diverse nuove librerie di codici esterni. Esiste anche una struttura abbastanza grande e complessa di Makefile collegata a un file configure.ac per gestire il processo di compilazione.

All'avvio del processo di compilazione, tutto viene compilato senza problemi, ma viene restituito l'errore temuto del linker quando si tenta di utilizzare una libreria di codice personalizzata appena aggiunta che abbiamo creato. Ora abbiamo passato una grande quantità di codice con un pettine a denti fini alla ricerca di errori di ortografia, verificando l'ordine in cui tutte le librerie sono incluse nel processo di compilazione e verificato che i file .o creati contengano ciò di cui abbiamo bisogno usando i dump, e tutti sono come e dove dovrebbero essere. Abbiamo anche testato la libreria separatamente e il problema sicuramente non sta qui.

In breve, abbiamo provato la maggior parte delle cose che normalmente dovresti fare in questi scenari.

Esiste uno strumento per C ++ in grado di rilevare automaticamente gli errori del linker, in modo simile a cppcheck o splint (entrambi i quali non abbiamo funzionato) che potrebbero essere utili qui?

È stato utile?

Soluzione

Non conosco la tua piattaforma, ma ho trascorso qualche tempo con problemi di linker in gcc fino a quando ho capito che il collegamento della libreria statica ( .a ) richiede un ordine specifico, non è lo stesso per collegare gcc object.o first.a second.a di gcc object.o second.a first.a .

Altri suggerimenti

FWIW (non molto) Provo ad affrontare questo tipo di problema usando un altro linker dato che ho accesso a un paio di piattaforme diverse. Se puoi usare un altro linker troverai:

a) i collegamenti del programma, che trasforma il tuo problema da "perché non collega?" a "quali sono le differenze tra linker e linking?" che non è esattamente un passo avanti, ma a volte un passaggio da un lato ti dà una prospettiva diversa da cui puoi vedere una soluzione;

o

b) non riesce a collegarsi, nel qual caso l'altro linker potrebbe fornire informazioni più utili sul perché non riesce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top