7

何らかの理由

cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN

math.h?を使用したコードでエラーが発生します。GCC バージョン 4.0.3 (文書化された作業バージョン) とバージョン 4.6.3 (私の現在のバージョン) の間に違いがある可能性はありますか?

makefileおよびasm.c@ https://gist.github.com/3801291

これはubuntu 12.04にあります

私の端末出力は要旨のコメントです。

4

2 に答える 2

11

それ以外の

cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c

試す:

cc -g -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c -lm

リンカーがライブラリを検索するとき、以前に未定義のシンボルの定義を含むモジュールにリンクします。

リンカが の-lm前に検索する場合foo.o、 thenpow()はまだ未定義ではありません。逆に、foo.o最初に来ると undefine さpow()れ、-lmその後解決できます。


編集:メイクファイルでこのアドバイスを実現するには、次の変更を行います。

CFLAGS=-g -DBLITZ_HOST_IS_LITTLE_ENDIAN
LDLIBS=-lm

...

asm: asm.c
        $(CC) $(CFLAGS) asm.c $(LDLIBS) -o asm
于 2012-09-28T17:51:29.220 に答える
0

私は最近、自動ビルダー、つまりDrone.ioを使用してこの問題に苦しんでいます。

問題は、Ubuntu 12.04 の gcc がデフォルトで-Wl,--as-neededとリンクしていたことです。私の場合、プロジェクトは autotools を使用していました。つまり、コンパイル順序を変更するために何かを書くのが面倒でした。代わりに、必要に応じてフラグを変更すると、問題が修正されました。

-gabriel_LDFLAGS = $(GLIB2_LIBS) $(DBUS_LIBS) -lssh
+gabriel_LDFLAGS = -Wl,--no-as-needed $(GLIB2_LIBS) $(DBUS_LIBS) -lssh

完全な情報については、 https://bitbucket.org/kikeenrique/gabriel/commits/f08eefdca3f7bb90f48f5a6fbfc8839422572508で修正コミットを確認できます。

修正を適用する前にエラーのあるログを確認することも、修正を適用した後エラーのないログを確認することもできます。

于 2016-03-08T16:02:11.837 に答える