Vogliamo creare una libreria condivisa (.so) per indirizzare tutte le distribuzioni, comprese quelle vecchie. Il codice è scritto in C++ e utilizza le caratteristiche di C++ 11, quindi il compilatore deve essere almeno gcc 4.7. Abbiamo notato che se compiliamo il nostro codice su una macchina Linux con gcc 4.7.2 installato (ad esempio, Ubuntu 12.10), allora il file .so ha "versione 1 (GNU/Linux)" mentre su sistemi operativi precedenti (es., CentOS 5.6) la versione è "versione 1 (SYSV)" - e le librerie con la versione più recente GNU/Linux non possono essere usate su sistemi operativi più vecchi.Compilare una libreria condivisa su Linux per indirizzare tutte le distribuzioni
Così abbiamo provato l'approccio di installare gcc 4.7 sulla macchina CentOS 5.6, compilare il nostro codice con questo compilatore e collegare staticamente con libstdC++ (-static-libstdC++) - questo ha prodotto un file .so che era utilizzabile su ogni linux trovato .
E questo ha funzionato bene per 32-bit. Tuttavia, quando abbiamo seguito lo stesso approccio su un sistema operativo a 64 bit (CentOS), questo non è riuscito con l'errore che il libstdC++. Esistente a cui abbiamo cercato di collegarci è stato compilato senza -fPIC. .
così abbiamo cercato di compilare il gcc 4.7.2 fonti con l'opzione “-con-pic”, ma non abbiamo potuto collegare alla nuova libstdC++ a - l'errore è:
/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: /usr/local/lib/libFoo.so: version node not found for symbol [email protected]_3.4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: failed to set dynamic section sizes: Bad value collect2: error: ld returned 1 exit status
Noi googled su che compilare libstdC++ con -fPIC può essere problematico, ma perché funziona per 32-bit e non per os a 64-bit? C'è un altro modo suggerito per creare uno .so per tutte le distribuzioni Linux?
Come sarebbe questo anche il lavoro? – mjs
+1 Domanda ben studiata! L'errore non è probabilmente colpa tua: ho cercato su google "non è riuscito a impostare le dimensioni dinamiche delle sezioni: valore errato" e ho visto solo i bugreports in arrivo. Tra l'altro '_ZNSs7_M_copyEPcPKcm' nel messaggio di errore è' std :: basic_string, std :: allocator > :: _ M_copy (char *, char const *, unsigned long) '. –
Ali