我是Linux新手。我可以使用两台Linux机器,一台40核心服务器(A)和一台群集(B)。我试图在两台机器上都做同样的事情,它可以在A上运行,而不能在B上运行。 A在debian squeeze / 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崩溃。当尝试使用消息St8bad_cast将Pkg3中的某种类型动态转换为Pkg2中定义的类型时,它会崩溃。对于另一个数据文件,当Pkg2中的函数尝试从Pkg3强制转换类型时,它崩溃,并显示消息“元素类型为N5ngfem8FE_Segm2E,预期类型为N5ngfem19ScalarFiniteElementILi1EEE”
我在哪里寻找问题?很抱歉含糊。这里的所有软件都是开源的,但是程序包太大了,以至于很少的工作就无法制作一个自包含的repro。我既没有使用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
即,它没有-E标志。但这就是我作为参考指定的方式。
笔记2:
链接规则-L / home / lv70227 / elan / ng / lib中定义的路径,
具有pkg2.so.0.0.0,指向它的两个符号链接以及pkg2.la,而不是pkg2.sa,因为它是由libtools创建的。
任何有关问题可能出在哪里的提示都值得赞赏。我在两台计算机上都遵循了相同的步骤,因此将偏差最小化以适应安装在A和B中的不同mpi,gcc,mkl库。
谢谢,
义良
最佳答案
正如我在评论中告诉您的那样,GCC 4.1和GCC 4.6是如此不同,以至于可能的解决方案是在较旧的计算机上安装GCC 4.6(可能是通过编译其源代码和所需的依赖项)。