2017-06-15 1 views
2

Ich versuche derzeit, Oracle Linux 6 OS auf einem SPARC S7-Server zu verwenden, um die NPB-Benchmarks (mit OpenMP-Multithreading-Unterstützung) auszuführen. Das Betriebssystem wird mit gcc 4.4.7 vorinstalliert, die Niagara 7-Optimierungen fehlen. Ich habe devtoolset-3 vom Oracle Yum Repository heruntergeladen, das gcc 4.9.2 in /opt/rh/devtoolset-3/root/usr/bin installiert hat. Wenn ich jedoch den NPB-Benchmark mit dem neueren gcc kompiliere, wird automatisch eine Verknüpfung zu Bibliotheken hergestellt, die dem älteren gcc 4.4.7 (in /usr/lib) zugeordnet sind. Dies führte dazu, dass mein Programm während der Ausführung segfault wurde. Ich glaube, das liegt daran, libgomp 4.4.7 ist nicht kompatibel mit libgomp 4.9.2. Ich habe versucht, verschiedene Wege zu den Bibliotheken in der gcc 4.9.2-Ordner (das ist /opt/rh/devtoolset-3/root/usr/lib/gcc); keine der Methoden arbeiten:Wie verknüpfe ich Bibliotheken von mehreren Standorten (entsprechend mehreren GCC-Versionen)?

  1. -Xlinker -rpath=lib_location
  2. -Wl -Bstatic
  3. -L lib_location

Der nächstgelegene ich bekam, als -Wl -Bstatic ~/libgomp.a oder -static -L ~/libgomp.a verwenden. Es findet keine Bibliotheken wie libm, die sich im Standardverzeichnis gcc lib (usr/lib) befinden.

Der eigentliche Befehl zur Verbindung verwendet wird:

/opt/rh/devtoolset-3/root/usr/bin/gcc -O3 -fopenmp -mcmodel=medmid -static -L/opt/rh/devtoolset-3/root/usr/lib/gcc/sparc64-redhat-linux/4.9.2 -o ../bin/bt.W.x bt.o initialize.o exact_solution.o exact_rhs.o set_constants.o adi.o rhs.o x_solve.o y_solve.o solve_subs.o z_solve.o add.o error.o verify.o ../common/print_results.o ../common/c_timers.o ../common/wtime.o -lm -L/opt/rh/devtoolset-3/root/usr/lib/gcc/sparc64-redhat-linux/4.9.2/lib/ 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lm 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lrt 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lpthread 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lc 

Gibt es eine Möglichkeit ich nur die libgomp Bibliothek von gcc 4.9.2 verknüpfen kann, während die übrigen Bibliotheken von gcc 4.4.7 verknüpfen?

+0

Normalerweise würden Sie PATH setzen, um das gewünschte Verzeichnis mit gcc vor dem System eins und LD_LIBRARY_PATH mit dem entsprechenden/lib64/zu versehen (unter der Annahme von 64 bit gcc). – tim18

+0

Können Sie es ausarbeiten? Ich habe jedoch versucht, LD_LIBRARY_PATH zu exportieren und '/ opt/rh/devtoolset-3/root/usr/lib /' zum Pfad hinzuzufügen, aber dies ändert nicht die Verwendung von Bibliotheken durch Linker. Es verwendet immer noch Standardbibliotheken, die bei der Ausführung des resultierenden Programms einen Fehler verursachen. –

Antwort

0

Die Compiler verwenden alle das System libgcc, libstdc++, Version 4.4.7 und können daher z. C++ 11.

Ich denke, die gcc53-c++-5.3.0-1.el6.x86_64.rpm wird tun. Kommt mit dem internen */gcc53/lib64{libgcc_s.so**, libgomp.so**, libstdc++} (Version 5.3.0) ... Bietet /usr/bin/{ gcc53, g++53 }

Das Paket wurde vor einem Jahr erstellt ... gut getestet, als zusätzliche Compiler. Download-Link: https://drive.google.com/file/d/0B7S255p3kFXNbTBneHgwSzBodFE/view?usp=sharing

+0

Der ursprüngliche Post war für SPARC, jedoch ein Plattform-Port von Oracle Linux (nicht Teil von Upstream RHEL oder Fedora). –

0

Wenn Sie vorhaben, die -Wl,-Bstatic Sache zu tun, stellen Sie sicher, es zu folgen sofort von -Wl,-Bdynamic normalisierte sich nach Ihren zusätzlichen Bibliothek Argument zurückzustellen. Standardmäßig haben nicht alle Systembibliotheken statische Versionen installiert, weshalb Sie z. cannot find -lc.

So können Sie versuchen, dies als eine Änderung Ihrer Abhilfe:

-Wl,-Bstatic ~/libgomp.a -Wl,-Bdynamic

Nicht schön, und diese Frage verdient eine viel bessere Antwort (das immer noch ziemlich viel ein Hack ist), aber es sollte erhalten Der Job ist für jetzt erledigt.

Verwandte Themen