2014-11-08 15 views
5

Sto provando a compilare del codice in OSX 10.10 utilizzando gli ultimi strumenti di linea XDd. La compilazione funziona, ma il collegamento è un incubo. Innanzitutto, ricevo un errore che definisce un simbolo come multiplo. Questo errore è corretto, ma le definizioni sono identiche e in librerie di terze parti che non controllo. Non riesco a capire come forzare il linker a ignorare questo problema. Una nota importante è che lo stesso codice compila, collega e gira perfettamente sulla mia scatola Ubuntu, sia con clang che con gcc. Questo problema del linker è solo sotto OS X. Le librerie sono statiche.Problemi di collegamento con OS X 10.10

Il secondo numero che incontro è ancora più strano. Se rimuovo alcune funzionalità (necessarie) solo così posso compilare e collegare il programma, ottengo il seguente messaggio divertente quando lo eseguo: "dyld: Symbol not found: __ZNSt12future_errorD1Ev". L'inferno è quello, e come lo aggiusto? Google non è stato utile su questo fronte.

risposta

3

OK, quindi ho risolto questo problema al meglio della mia comprensione. Ecco cosa ho imparato. Innanzitutto, non sembra possibile risolvere il problema del collegamento statico su OSX utilizzando la versione "speciale" di Apple di Clang. A parte la modifica del codice sorgente della libreria, sembra che non ci sia modo di dire al compilatore di ignorare le definizioni dei simboli duplicate. C'erano tali opzioni (ad esempio -m), ma sono state tutte deprecate per un po '. Pertanto, per risolvere questo problema, dovevo rendere dinamica almeno una delle librerie.

Il secondo problema era dovuto al fatto che una delle librerie contro cui stavo cercando di collegarmi era, in qualche modo, compilata contro libstdC++. Tuttavia, il clang di Apple vuole compilare tutto contro libC++ per impostazione predefinita. Quindi, il problema era di compatibilità tra le due librerie --- std :: future_error aveva un nome diverso in entrambi e al momento dell'esecuzione (quando stavo usando libC++) il simbolo da libstdC++ non poteva essere trovato. La soluzione corretta per questo problema (che ho morso il proiettile e ho fatto) era di ricompilare qualsiasi libreria in questo progetto usando libC++, in quanto le due implementazioni della libreria standard non sono, in generale, compatibili.

In ogni caso, spero che questo finisca per essere utile a qualcun altro. Trovo incredibilmente frustrante che Apple debba essere abbastanza diverso da garantire che le build che funzionano perfettamente con più compilatori sotto Linux, si rompano orribilmente nel loro sistema operativo con la loro versione personalizzata di clang.

+0

Infine, una risoluzione al mio problema di collegamento con le librerie C++. Ho aggiornato a Yosemite, ricostruito fink e ho scoperto che il mio vecchio codice non era più collegato allo stesso modo "Simboli indefiniti per l'architettura x86_64:". A proposito, sembra che non ci sia più una forza bruta - start-group/- end-group in ld di OSX più. –