在共享对象中命名不兼容的符号 - 在哪里查找问题

时间:2012-02-10 22:29:05

标签: c++ linux makefile shared-libraries libtool

我是Linux新手。我可以访问两台Linux机器,一台40核心服务器(A)和一台集群(B)。我试图在两台机器上做同样的事情,它适用于A而不适用于B.我对两者都没有sudo权利。一个关于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崩溃。当它尝试将Pkg3中的某些类型动态转换为Pkg2中定义的类型并且消息为St8bad_cast时,它会崩溃。对于另一个数据文件,当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库。

谢谢你, ELAN。

1 个答案:

答案 0 :(得分:0)

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