System Weit libxml2
ich die Chroma-Suite von Physik-Simulationen auf dem Supercomputer JUQUEEN kompilieren wollen, die ein IBM Bluegene/Q-Installation ist. Die Frontends laufen auf RedHat Linux 6. Architektur ist PowerPC 7 sowohl auf Frontend als auch auf Compute Nodes. Die verwendeten CPUs unterscheiden sich jedoch, das Frontend verfügt über IBM Power 740, die Rechenknoten sind IBM Power A2-Chips. Compiler wie mpigcc
und mpig++
kompilieren automatisch für die Compute-Knoten kompilieren.Systemweite libxml2 nicht funktioniert, Zusammenstellung von Quellen failes in configure
Moderne Versionen von Programmen können mit module
in den Pfad geladen werden. Es gibt Abhängigkeiten von zwei anderen Bibliotheken, die kompiliert werden müssen. Ich bin fertig mit qmp
für jetzt. qdpxx
hängt auch von libxml2
und das ist, wo ich steckte:
chroma --- qdpxx --- qmp
\-- libxml2
Auf meinem Fedora 24 Workstation, ich qdpxx
ganz gut mit der systemweiten Installation von libxml2
zusammenstellen kann. Ich habe gerade die RPM-Pakete libxml2
und libxml2-devel
installiert und musste keine -with-libxml2=DIR
Argumente zu qdpxx/configure
angeben.
Auf der Supercomputer-Frontend, bekomme ich diese:
+ ./configure --prefix=/homec/hbn28/hbn28e/local/ --host=powerpc64-bgq-linux --build=powerpc64-unknown-linux-gnu --enable-bgq-thread-binding --enable-openmp --enable-parallel-arch=parscalar --enable-precision=double --enable-parallel-io --enable-qdp-alignment=128 --with-qmp=/homec/hbn28/hbn28e/local/ 'CFLAGS=-O2 -finline-limit=50000 -I/usr/local/bg_soft/mpich3/include -Wall -Wpedantic -fdiagnostics-color=auto --std=c99 -fopenmp --std=gnu99' 'CXXFLAGS=-O2 -finline-limit=50000 -I/usr/local/bg_soft/mpich3/include -Wall -Wpedantic -fdiagnostics-color=auto --std=c++11 -fopenmp' LDFLAGS= LIBS= CC=/bgsys/local/gcc/4.9.3/bin/mpigcc CXX=/bgsys/local/gcc/4.9.3/bin/mpig++
checking for C++ compiler default output file name... a.out
checking whether the C++ compiler works... yes
checking whether we are cross compiling... yes
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether /bgsys/local/gcc/4.9.3/bin/mpig++ accepts -g... yes
checking for powerpc64-bgq-linux-ranlib... no
checking for ranlib... ranlib
configure: WARNING: using cross tools not prefixed with host triplet
checking for powerpc64-bgq-linux-ar... no
checking for ar... ar
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for powerpc64-bgq-linux-strip... no
checking for strip... strip
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for style of include used by make... GNU
checking dependency style of /bgsys/local/gcc/4.9.3/bin/mpig++... gcc3
configure: Configuring QDP++ for Nd = 4
configure: Configuring QDP++ for Nc = 3
configure: Configuring QDP++ for Ns = 4
configure: Configuring QDP++ Alignment size=16
configure: Fallback to generic C routines if needed: yes
configure: Enabling BGQ Thread Binding
configure: Configuring for double precision
configure: Configuring QDP++ with cb2 layout
configure: Parscalar build! Checking for QMP
checking for qmp-config... /homec/hbn28/hbn28e/local//bin/qmp-config
configure: Found QMP configuration program /homec/hbn28/hbn28e/local//bin/qmp-config
configure: QMP compile flags: -I/homec/hbn28/hbn28e/local/include
configure: QMP linking flags: -L/homec/hbn28/hbn28e/local/lib
configure: QMP libraries flags: -lqmp
checking if we can compile/link of a simple QMP C++ program... yes
Value of with_libxml2 is XX
checking for xml2-config... /usr/bin/xml2-config
configure: Found libxml2 configuration program
configure: libxml2 compile flags: -I/usr/include/libxml2
configure: libxml2 libraries flags: -lxml2 -lz -lm
checking if we can compile/link a simple libxml2 program... no
configure: error: Cannot compile/link a program with libxml2.
Use --with-libxml2=<dir> to select a working version.
In qdpxx/config.log
, der entsprechende Abschnitt dieses hier ist:
configure:4321: checking for xml2-config
configure:4339: found /usr/bin/xml2-config
configure:4351: result: /usr/bin/xml2-config
configure:4370: Found libxml2 configuration program
configure:4374: libxml2 compile flags: -I/usr/include/libxml2
configure:4378: libxml2 libraries flags: -lxml2 -lz -lm
configure:4386: checking if we can compile/link a simple libxml2 program
configure:4434: /bgsys/local/gcc/4.9.3/bin/mpig++ -o conftest -O2 -finline-limit=50000 -I/usr/local/bg_soft/mpich3/include -Wall -Wpedantic -fdiagnostics-color=auto --std=c++11 -fopenmp -I/usr/include/libxml2 conftest.cpp -lxml2 -lz -lm >&5
conftest.cpp: In function 'int main()':
conftest.cpp:30:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
char *docname="foo";
^
conftest.cpp:28:13: warning: unused variable 'argc' [-Wunused-variable]
int argc ; char **argv ;
^
conftest.cpp:28:27: warning: unused variable 'argv' [-Wunused-variable]
int argc ; char **argv ;
^
conftest.cpp:29:19: warning: variable 'doc' set but not used [-Wunused-but-set-variable]
xmlDocPtr doc;
^
/usr/local/bg_soft/gcc/4.9.3/bin/../lib/gcc/powerpc64-bgq-linux/4.9.3/../../../../powerpc64-bgq-linux/bin/ld: cannot find -lxml2
/usr/local/bg_soft/gcc/4.9.3/bin/../lib/gcc/powerpc64-bgq-linux/4.9.3/../../../../powerpc64-bgq-linux/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status
configure:4441: $? = 1
configure: failed program was:
| /* confdefs.h. */
| #define PACKAGE_NAME "qdp++"
| #define PACKAGE_TARNAME "qdp--"
| #define PACKAGE_VERSION "1.44.0"
| #define PACKAGE_STRING "qdp++ 1.44.0"
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE "qdp--"
| #define VERSION "1.44.0"
| #define QDP_ND 4
| #define QDP_NC 3
| #define QDP_NS 4
| #define QDP_AC_ALIGNMENT_SIZE 16
| #define QDP_USE_GENERIC_OPTS 1
| #define QDP_USE_BLUEGENEL 1
| #define BASE_PRECISION 64
| #define QDP_USE_CB2_LAYOUT 1
| #define ARCH_PARSCALAR 1
| #define QDP_USE_LIBXML2 1
| /* end confdefs.h. */
|
| #include <libxml/xmlmemory.h>
| #include <libxml/parser.h>
|
| int
| main()
| {
|
| int argc ; char **argv ;
| xmlDocPtr doc;
| char *docname="foo";
| doc = xmlParseFile(docname);
| ;
| ;
|
| ;
| return 0;
| }
configure:4483: result: no
configure:4486: error: Cannot compile/link a program with libxml2.
Use --with-libxml2=<dir> to select a working version.
Die cannot find -lxml2
klingt nicht dort /usr/lib/libxml2.so
ist. Und tatsächlich, dort ist keiner. Laufen locate libxml
gibt die folgenden interessanten Linien:
/usr/include/libxml2/libxml/xpath.h
...
/usr/include/libxml2/libxml/xpointer.h
/usr/lib/libxml2.so.2
/usr/lib/libxml2.so.2.7.6
/usr/lib64/libxml2.so
/usr/lib64/libxml2.so.2
/usr/lib64/libxml2.so.2.7.6
Anscheinend ist die 32-Bit-Version einen seltsamen so Namen hat und nur die 64-Bit-Version hat einen regelmäßigen so Namen. Der Versuch, -L/usr/lib64
hinzuzufügen stellte sich heraus, andere Dinge zu brechen:
+ ./configure --prefix=/homec/hbn28/hbn28e/local/ --host=powerpc64-bgq-linux --build=powerpc64-unknown-linux-gnu --enable-bgq-thread-binding --enable-openmp --enable-parallel-arch=parscalar --enable-precision=double --enable-parallel-io --enable-qdp-alignment=128 --with-qmp=/homec/hbn28/hbn28e/local/ 'CFLAGS=-O2 -finline-limit=50000 -I/usr/local/bg_soft/mpich3/include -Wall -Wpedantic -fdiagnostics-color=auto --std=c99 -fopenmp --std=gnu99' 'CXXFLAGS=-O2 -finline-limit=50000 -I/usr/local/bg_soft/mpich3/include -Wall -Wpedantic -fdiagnostics-color=auto --std=c++11 -fopenmp' LDFLAGS=-L/usr/lib64/ LIBS= CC=/bgsys/local/gcc/4.9.3/bin/mpigcc CXX=/bgsys/local/gcc/4.9.3/bin/mpig++
checking for C++ compiler default output file name...
configure: error: in `/homec/hbn28/hbn28e/qdpxx':
configure: error: C++ compiler cannot create executables
See `config.log' for more details.
In der Log-Datei, sagt er folgendes:
configure:2159: /bgsys/local/gcc/4.9.3/bin/mpig++ -O2 -finline-limit=50000 -I/usr/local/bg_soft/mpich3/include -Wall -Wpedantic -fdiagnostics-color=auto --std=c++11 -fopenmp -L/usr/lib64/ conftest.cpp >&5
/usr/local/bg_soft/gcc/4.9.3/bin/../lib/gcc/powerpc64-bgq-linux/4.9.3/../../../../powerpc64-bgq-linux/lib/crt1.o: In function `_start_no_magic':
(.text+0x58): undefined reference to `__libc_no_magic_start_main'
/bgsys/local/gcc/4.9.3/powerpc64-bgq-linux/lib/libdl.so.2: undefined reference to `[email protected]_PRIVATE'
collect2: error: ld returned 1 exit status
configure:2163: $? = 1
configure:2201: result:
configure: failed program was:
| /* confdefs.h. */
| #define PACKAGE_NAME "qdp++"
| #define PACKAGE_TARNAME "qdp--"
| #define PACKAGE_VERSION "1.44.0"
| #define PACKAGE_STRING "qdp++ 1.44.0"
| #define PACKAGE_BUGREPORT "[email protected]"
| /* end confdefs.h. */
|
| int
| main()
| {
|
| ;
| return 0;
| }
configure:2207: error: in `/homec/hbn28/hbn28e/qdpxx':
configure:2210: error: C++ compiler cannot create executables
Es scheint, dass ich weggeschmissen nur alle anderen Pfade, wo Bibliotheken solche befinden können dass nichts mehr baut.
Der Versuch, einen symbolischen Link von /usr/lib/libxml2.so.2
bis $HOME/libxml2.so
zu erstellen, und adding -L$HOME
hat auch nicht funktioniert.
Versuch libxml2 zu Kompilieren von Git
An dieser Stelle ich die systemweite Installation gestoppt verfolgt und versuchte libxml2
aus der Git-Repository zu installieren. Also habe ich das Repository geklont und ./autogen.sh
eingegeben. Dies versagte mit:
Checking zlib
./configure: line 12546: syntax error near unexpected token `Z,zlib,'
./configure: line 12546: ` PKG_CHECK_MODULES(Z,zlib,'
Die Autotools dort behaupten, Version 2.69 zu sein. Dies ist dieselbe Version, die auf dem Universitätscluster installiert ist (wo es auch fehlschlägt). Auf meiner Fedora 24-Workstation ist dieselbe Version installiert, aber ./autogen.sh
läuft gerade durch und erstellt eine Makefile
.
Ich bin jetzt ein bisschen verloren. Gibt es einen Fehler im Build-Skript von libxml2
, wenn es auf dem ppc64
RedHat und auch auf dem amd64
Debian-Hochschulcluster aber nicht meinem x86_64
Fedora-Laptop scheitert?
Wie konnte ich das configure
Skript von qdpxx
die systemweite Installation von libxml2
verwenden? Es spielt extrahiert bereits die richtigen Fahnen mit xml2-config
:
configure: libxml2 compile flags: -I/usr/include/libxml2
configure: libxml2 libraries flags: -lxml2 -lz -lm
Was kann ich tun, um mein Programm weiter zusammengestellt zu erhalten?
Versuchen Sie, das Ziel auf 'ppc64' oder' powerpc64' zu setzen. Dies sollte automatisch Ihren Code zu 64-Bit-Binärcode erstellen. – alvits
nicht versionierte Shared Libraries werden normalerweise von '* -devel'-Paketen bereitgestellt. Dies sind nur Links zu der versionierten Bibliothek. Dies bedeutet, dass nur 'libxml2-devel. * 64' installiert ist. Die 32-Bit-Version ist nicht installiert. – alvits
Um den 'PKG_CHECK_MODULES' Fehler zu lösen, installieren Sie einfach' pkg-config'. Sie können auch einen Tarball einer offiziellen libxml2-Version herunterladen, die mit einem vorgefertigten Konfigurationsskript ausgeliefert wird. Aber ich würde wirklich versuchen, den Build mit libxml2 des Systems zuerst zu arbeiten. Wenn der @alvits-Vorschlag nicht funktioniert, wie wäre es dann, den Symlink manuell zu erstellen? – nwellnhof