0

我是 Linux 新手。我可以访问两台 Linux 机器,一台 40 核服务器(A)和一个集群(B)。我试图在两台机器上做同样的事情,它在 A 上工作,在 B 上不起作用。我对这两个机器都没有 sudo 权限。A 在 debian 挤压/sid 上运行。B 在内核 2.6.18-238.el5 上运行。我在 /etc 下找不到任何发布信息文件。A 具有 gcc 4.6.2,而 B 具有 gcc 4.1.2。

我在两台机器上本地编译并安装了一个给定的网格划分软件 Pkg1 和 Pkg2,一个给定的求解器。两者都需要 Libtool 和 automake。Pkg2 是一个 .so 文件。一切正常,我可以运行示例。代码是用 mpicxx 构建的。两者都有不同的 mpi 编译器。A 使用 openmpi154,B 使用 qlogicmpi_gnu-0.1.0。

现在我介绍我的代码,比如 Pkg3,一些 .cpp 文件。我用它构建了一个.so。我没有使用 Libtool 和 automake。使用了一个简单的 make 文件,使用 gcc 作为编译器和链接器(也尝试过 mpicxx)。

在 A 上,Pkg3 运行良好。在 B 上,Pkg3 崩溃。当它尝试将 Pkg3 中的某些类型动态地转换为 Pkg2 中定义的类型并带有消息 St8bad_cast 时,它会崩溃。对于另一个数据文件,当 Pkg2 中的函数尝试从 Pkg3 转换类型时,它崩溃,消息“元素类型为 N5ngfem8FE_Segm2E 预期类型为 N5ngfem19ScalarFiniteElementILi1EEE”

我在哪里寻找问题?抱歉含糊其辞。这里的所有软件都是开源的,但是软件包太大而无法用很少的工作制作一个独立的复制品。我既没有使用过 automake 和 Libtools,也没有使用过 mpi,这使问题更加复杂。我查看了 Pkg1 和 Pkg2 的 makefile 并尝试用我的简单 makefile 映射 CXX、LDFLAGS 等,但是 automake/libtools 创建的多个间接使得它变得困难。

我了解 Pkg2 中的符号在符号表中的处理方式与 Pkg3 中的不同。但这应该已经处理了链接器?!我已经尝试过为 Pkg3 使用和不使用“-Wl,-E”选项。-fPIC 始终存在。链接 Pkg3 的规则指向库 Pkg2 ()。我已经发布了 Pkg3 的 makefile 的正文。

 %.o : %.cpp
     gcc  -O2 -fopenmp -fPIC -DNETGEN_ELTRANS -DUSE_TIMEOFDAY -DLAPACK -I. -I$(NETGENDIR)/../include -c $? -o $@

 libmyngsolve.so : $(objects)
      gcc -shared -Wl,-E -fopenmp -fPIC $(objects) -L/home/lv70227/elan/ng/lib -lngsolve -o $@

 clean:
     rm *.o libmyngsolve.so

注1:

Pkg2的./configure命令有-Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -Wl,--end-group -lpthread ie,它没有 -E 标志。但这就是它被指定给我的方式,作为参考。

笔记2:

链接规则中定义的路径 -L/home/lv70227/elan/ng/lib 有 pkg​​2.so.0.0.0,两个符号链接指向它,以及 pkg2.la,而不是 pkg2.sa,因为它是由库工具。

任何关于问题可能出在哪里的提示都值得赞赏。我在两台机器上都遵循了相同的程序,使偏差最小以适应安装在 A 和 B 中的不同 mpi、gcc、mkl 库。

谢谢你,伊兰。

4

1 回答 1

0

正如我在评论中告诉你的那样,GCC 4.1 和 GCC 4.6 是如此不同,一个可能的解决方案是在你的旧机器上安装一个 GCC 4.6(可能通过编译它的源代码和所需的依赖项)。

于 2012-02-13T06:23:19.237 回答