9

物理実験用のデータ解析プログラムを使用することになっています。私はそれをコンパイルすることはできません。

コードは古く、私が見つけた現在の GCC バージョンと実際には互換性がありません。もう少し時間がかかるようにするために、Mac でコンパイルできるようにすべての makefile を変更した人からコードを入手しました。私は C++ の経験はありませんが、マンページ、Google、および忍耐力により、途中で多くのエラーを修正しましたが、1 週間の試行とグーグルの後でさえ、これに固執しています。

関連するエラーメッセージは次のとおりだと思います。

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

何が原因で、何が解決策になるのでしょうか?

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 の変更が何かを破壊したのかもしれません。また、経験が不足しているため、他にどのような情報が必要なのかよくわかりませんが、喜んで返信します。

4

3 に答える 3

3

ファイル-sharedを生成するときにコマンド ライン オプションを忘れたようです。libCommandLineInterface.soそれは、これらの複数の定義エラーを説明します。生成しているファイルが (動的ライブラリではなく) 実行可能ファイルであるとリンカが判断した場合、起動コードなどでリンクします。この .so ファイルを使用しようとすると、起動コードから入ってくるシンボルが動的ライブラリを使用する実行可能ファイルに追加されているものと競合します。

libTransfer.so エラーは、省略されている同じフラグに関連している可能性があります。共有ライブラリはダングリング参照 (ライブラリの使用時に解決される) を持つことができますが、実行可能ファイルはリンク時にすべてのシンボルを解決する必要があります。これはおそらく物事を単純化しすぎたものですが、Linux での動的リンクについて詳しく説明する必要はありませんでした。:)とにかく、-sharedオプションを追加すると、未定義の参照エラーも解決される場合があります。

于 2010-09-12T15:47:15.860 に答える
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必要なものが含まれている場合は、 など_endを定義する素材を焼灼する必要がありますmain

vtables の欠落についても心配する必要があります。

[...]/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'
于 2010-09-12T15:26:30.653 に答える
1

解決しました。eh_frame_hdr の問題は、このスレッドによって解決されました。未定義の参照はlibTransfer.so、最初の の後に削除しmake、その後すぐにmake再度実行することで解決されました。方法は聞かないでください。でもそれでコンパイルできました。

于 2010-09-26T17:33:46.250 に答える