我是 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 有 pkg2.so.0.0.0,两个符号链接指向它,以及 pkg2.la,而不是 pkg2.sa,因为它是由库工具。
任何关于问题可能出在哪里的提示都值得赞赏。我在两台机器上都遵循了相同的程序,使偏差最小以适应安装在 A 和 B 中的不同 mpi、gcc、mkl 库。
谢谢你,伊兰。