2016-01-07 5 views
12

私は、継続的な統合にCircleCIを使用するオープンソースフレームワークを維持しています。私は最近、プロジェクトが急に奇妙な状況でビルドを拒否した壁に当たった。ネイティブ依存の "多重定義"リンカーエラーのため、ビルドに失敗します

Build 27が最後のものでした。その後、私は依存関係を少し変更し、ビルドに失敗したことに気付きました。私は成功せずにそれを修正しようとしたので、最後の作業設定and it still failedに戻りました。

障害の理由は、OpenGL(OpenGLRaw)とGLFW(bindings-glfw)という2つのネイティブCライブラリへのバインドの2つの依存関係です。彼らは多くの行とのリンク段階でエラーになります:

/tmp/ghc18975_0/ghc18975_6.o:(.data+0x0): multiple definition of `__stginit_bindizu0Qm7f8FzzUN32WFlos7AKUm_BindingsziGLFW' 
/tmp/ghc18975_0/ghc18975_6.o:(.data+0x0): first defined here 

私はなぜそれが起こる可能性があるか完全に困惑しています。これらのライブラリの正確な同じバージョンは元のビルドが成功したときにビルドされ、毎回新鮮なコンテナを使用するCI上にあります(私は明らかにキャッシュのクリーニングを試みました)。ビルドにはapt-get updatecabal updateが含まれているため、外部リソースが変更されている可能性があります。

誰かがこのような問題に遭遇したことがある場合は、問題の診断と除去に大いに役立つ可能性があります。この特定のmultiple definitionスケールの問題に対するGoogleの検索では何も得られません。


私は(インターネット上でいくつかのヒントがそれを指摘しているため)秘密結社バージョンを更新しようとしましたが、と:

cabal-install version 1.22.6.0 
using version 1.22.4.0 of the Cabal library 

問題が解消されません。


私が言いたいことを忘れていたことの1つは、厳密には単純なパッケージミックスアップのようには見えないということです。私はSSH経由でそのボックスに接続し、そこに空のフォルダとサンドボックスを作成しました。同じような問題でも簡単にcabal install OpenGLRawが失敗しました。そのため、同じモジュールの2つのバージョンが競合する可能性はほとんどありません。


I've also extracted a verbose cabal installation log


SSHは、OpenGLRawの生ソースをクローンしましたが、それでも同じですか? 7.6.3を試しましたが、まだ同じです。

+1

私は(CircleCIでも)同じような問題がありますが、 'direct-sqlite-2.3.16'です。 – jpvillaisaza

+2

運がいいですか? 'hslua'でも同じことが起こるようです。 https://github.com/commercialhaskell/stack/issues/1624およびhttps://github.com/osa1/hslua/issues/40を参照してください。 – jpvillaisaza

+1

@jpvillaisaza私はできる限りどこにでもエスカレートしました。おそらくハスケルredditを除いて。賞金をここに置いて、最高のことを望む時間。 –

答えて

13

gcc-4.9.2で問題があるようです。あなたのプロジェクトをフォークし、build with high verbosity levelを開始し、circleciコンテナに接続し、正確なリンクコマンドを実行します。これは、同じように失敗します。

[email protected]:~$ /usr/bin/gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE '-Wl,--hash-size=31' -Wl,--reduce-memory-overheads -Wl,--no-as-needed -nostdlib -Wl,-r -nodefaultlibs '-Wl,--build-id=none' -o Types.o /tmp/ghc17998_0/ghc_15.ldscript 
/tmp/ghc17998_0/ghc_14.o: In function `r2vy_closure': 
(.data+0x0): multiple definition of `__stginit_OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes' 
/tmp/ghc17998_0/ghc_14.o:(.data+0x0): first defined here 
/tmp/ghc17998_0/ghc_14.o: In function `r2vy_closure': 
(.data+0x8): multiple definition of `OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes_makeGLDEBUGPROC_closure' 
/tmp/ghc17998_0/ghc_14.o:(.data+0x8): first defined here 
/tmp/ghc17998_0/ghc_14.o: In function `c2y7_info': 
(.text+0xc0): multiple definition of `OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes_makeGLDEBUGPROC_info' 
/tmp/ghc17998_0/ghc_14.o:(.text+0xc0): first defined here 

をしかしgcc-4.8と、それは動作します:

[email protected]:~$ /usr/bin/gcc-4.8 -fno-stack-protector -DTABLES_NEXT_TO_CODE '-Wl,--hash-size=31' -Wl,--reduce-memory-overheads -Wl,--no-as-needed -nostdlib -Wl,-r -nodefaultlibs '-Wl,--build-id=none' -o Types.o /tmp/ghc17998_0/ghc_15.ldscript 
[email protected]:~$ 

ですから、gcc年上に切り替え、おそらくgcc開発者にバグを報告する必要があります。

追加:Hereは、gccバージョンの切り替え方法の例です。そしてhereは成功したビルドです。

+2

これは素晴らしいことです。どうもありがとうございます! –

+0

それは私のためにも機能します。ありがとう! – jpvillaisaza

+2

ありがとうございます。私は数日の間、HsOpenSSLを構築しようとしているこの問題に対して私の頭を叩いていました! – mightybyte

関連する問題