C ++:编译错误 - “不会创建.eh_frame_hdr表”

时间:2010-09-12 15:17:27

标签: c++ compilation linker ld

我应该使用数据分析程序进行物理实验。我不能让它编译。<​​/ p>

代码很旧,与我能找到的当前GCC版本并不完全兼容。为了让事情更加节省时间,我从一个修改了所有makefile的人那里获得了代码,以便在Mac上编译。我没有C ++经验,但是对于man-pages,Google和耐心,我已经修复了很多错误,但即使经过一周的尝试和谷歌搜索,我仍然坚持这一点。

我认为相关的错误信息如下:

/usr/bin/ld: error in /home/daniel/skola/exjobb/miniballscripts
/lib/libCommandLineInterface.so(.eh_frame); no .eh_frame_hdr table will be created.`

可能是什么原因,可以采取什么补救措施?

我之前编译过{p> libCommandLineInterface.so,没有任何明显的错误消息:

$ make  
g++ -g2 -O2 -I./ -c CommandLineInterface.cc -o CommandLineInterface.o  
g++ -g  -Wl -o /home/daniel/skola/exjobb/miniballscripts/lib/libCommandLineInterface.so
CommandLineInterface.o -lm -L/home/daniel/skola/exjobb/miniballscripts/lib -lgcc -lc  
Done

我的g ++ - 版本是g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3,amd64。

正如我所说,我没有使用C ++的经验,所以也许我天真的Makefile修改已经破坏了一些东西。我缺乏经验也使我不知道需要哪些其他信息来帮助我,但我很乐意回复。

3 个答案:

答案 0 :(得分:3)

在生成-shared文件时,您似乎忘记了libCommandLineInterface.so命令行选项。这可以解释那些多重定义错误。如果链接器认为它生成的文件是可执行文件(而不是动态库),那么它将链接在启动代码等中。当您尝试使用此.so文件时,那些符号来自启动代码将与正在添加到使用动态库的可执行文件中的那些冲突。

libTransfer.so错误可能与被忽略的同一个标志有关。允许共享库具有悬空引用(在使用库时得到解析),但是可执行文件必须在链接时解析所有符号。这可能是对事物的过度简化,但我从来不需要了解有关linux中动态链接的更多细节。 :)无论如何,添加-shared选项也可以解决未定义的引用错误。

答案 1 :(得分:1)

关注的链接错误始于:

[...]/lib/libCommandLineInterface.so: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): first defined here
[...]/lib/libCommandLineInterface.so: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crti.o:(.fini+0x0): first defined here
[...]/lib/libCommandLineInterface.so:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
[...]/lib/libCommandLineInterface.so: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.data+0x0): first defined here
[...]/lib/libCommandLineInterface.so: In function `__data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): first defined here
[...]/lib/libCommandLineInterface.so: In function `_edata':
(*ABS*+0x607130): multiple definition of `__bss_start'
[...]/lib/libCommandLineInterface.so: In function `_end':
(*ABS*+0x6073b8): multiple definition of `_end'
[...]/lib/libCommandLineInterface.so: In function `_edata':
(*ABS*+0x607130): multiple definition of `_edata'
[...]/lib/libCommandLineInterface.so: In function `main':
/home/daniel/skola/exjobb/miniballscripts/Common/CommandLineInterface.cc:6: multiple definition of `main'

多重定义的符号在Unix上是“标准的” - 我也不需要在Mac上自己打扰它们,尽管我不在那里进行GUI编程。

您需要以非常偏见的态度看待libCommandLineInterface.cc,并决定是否提供您需要的任何内容。您可以完全删除它。如果它包含您需要的某些内容,则需要烧录定义_start_endmain等的材料。

你也将不得不担心丢失的vtable:

[...]/libTransfer.so: undefined reference to `vtable for Annular'
[...]/libTransfer.so: undefined reference to `ROOT::GenerateInitInstance(Barrel const*)'
[...]/libTransfer.so: undefined reference to `ROOT::GenerateInitInstance(Annular const*)'
[...]/libTransfer.so: undefined reference to `vtable for Barrel'
[...]/libTransfer.so: undefined reference to `vtable for Crystal'
[...]/libTransfer.so: undefined reference to `vtable for Germanium'

答案 2 :(得分:0)

它已经解决了。这个线程解决了eh_frame_hdr问题。通过在第一个libTransfer.so之后删除make,然后直接再次运行make来解决未定义的引用。不要问我怎么做,但这使它编译。<​​/ p>