0

我需要在要在 Cray 机器上编译的项目中使用 libxml2。原则上它已安装,有一个xml2-config程序可以给我链接器标志:

$ xml2-config --libs
-lxml2 -L/lib64 -lz -llzma -lm -ldl

我有一个非常简单的测试程序:

$ cat test.c
int main() { return 0; }

虽然原则上不需要,但我可以gcc test.c -lxml2 -L/lib64 -lz -llzma -lm -ldl很好地编译它。但是,对于 Cray 编译器,它不起作用:

$ cc test.c -lxml2 -L/lib64 -lz -llzma -lm -ldl
/opt/cray/pe/cce/8.6.5/binutils/x86_64/x86_64-pc-linux-gnu/bin/ld: cannot find -lxml2
/opt/cray/pe/cce/8.6.5/binutils/x86_64/x86_64-pc-linux-gnu/bin/ld: cannot find -llzma

与 Cray 包装的英特尔编译器相同的故事:

$ module swap PrgEnv-cray PrgEnv-intel

$ cc test.c -lxml2 -L/lib64 -lz -llzma -lm -ldl
ld: cannot find -lxml2
ld: cannot find -llzma

我需要使用 Cray 包装的编译器才能将正确的 MPI 和大页面放入我的程序中。

有什么我可以做的(除了尝试自己编译 libxml2,请参阅我的其他问题)来获得这个链接?

4

1 回答 1

1

如果确实安装了 libxml2,那么它似乎xml2-config是在骗你。我最好的猜测是 libxml2 安装在与构建它的位置不同的位置,或者它在安装后被移动。在任何情况下,输出xml2-config --libs假定在您的系统上,libxml2 安装在默认库搜索路径中,并且 liblzma 和其他需要的库安装在默认库搜索路径中或/lib64(如果尚未在搜索路径中) )。事实上,他们不是。

与其从头开始构建库,最好的办法是找到它们的实际安装位​​置,并-L在构建程序时将相应的选项传递给链接器:

cc test.c -L/path/to/libxml2/directory -lxml2 -lz -llzma -lm -ldl
于 2018-03-18T19:30:45.267 回答