2017-11-15 8 views
0

TL; DR定義されていない参照を `nettle_sha256_digest`に修正するにはどうしたらいいですか?

私はこの依存関係を使用して、外出先プロジェクト構築しようとしています:https://github.com/mqu/openldap、順番に外部lldapとllberライブラリをリンクし、順番にlnettleを使用していますlgnutlsを使用し、あります私は立ち往生している。

go buildは、未定義の参照の長いリストを生成し、ビルドに失敗します。ここではサンプルです:

/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o): In function `_ctx_init': 
(.text+0x468): undefined reference to `nettle_sha256_digest' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o): In function `_ctx_init': 
(.text+0x476): undefined reference to `nettle_sha224_init' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o): In function `_ctx_init': 
(.text+0x494): undefined reference to `nettle_sha256_init' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o): In function `_ctx_init': 
(.text+0x4b8): undefined reference to `nettle_sha256_digest' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o): In function `_ctx_init': 
(.text+0x4c6): undefined reference to `nettle_sha256_init' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o):(.data.rel.ro+0x18): undefined reference to `nettle_sha256_init' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o):(.data.rel.ro+0x28): undefined reference to `nettle_sha256_digest' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o):(.data.rel.ro+0x58): undefined reference to `nettle_sha224_init' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o):(.data.rel.ro+0x68): undefined reference to `nettle_sha224_digest' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o):(.data.rel.ro+0x98): undefined reference to `nettle_sha1_init' 
/usr/lib/x86_64-linux-gnu/libgnutls.a(sha-x86-ssse3.o):(.data.rel.ro+0xa8): undefined reference to `nettle_sha1_digest' 

そして、私のgo buildコマンド:

CC=/usr/local/musl/bin/musl-gcc \ 
    GOOS=linux go build \ 
    -o /bin/activedirectory \ 
    -ldflags '-linkmode external -extldflags "-static -L/usr/lib/x86_64-linux-gnu -lnettle -lp11 -lsasl2 -lgnutls -ltasn1"' 

私はlibnettle4nettle-devlibghc-nettle-devnettle-binをインストールすることでこれを解決しようとしています。私は-lnettleをldflagsに必ず含めました。運がない。

もっとコンテキスト

OpenLDAPのライブラリーは、コードでldaplber LIBSをリンクされて:これは私を必要としていた

package openldap 

/* 

#define LDAP_DEPRECATED 1 
#include <stdlib.h> 
#include <ldap.h> 

static inline char* to_charptr(const void* s) { return (char*)s; } 
static inline LDAPControl** to_ldapctrlptr(const void* s) { 
    return (LDAPControl**) s; 
} 
*/ 
// #cgo CFLAGS: -DLDAP_DEPRECATED=1 
// #cgo linux CFLAGS: -DLINUX=1 
// #cgo LDFLAGS: -lldap -llber 

あなたが見るすべてのライブラリをインストールし、LDFLAGSに含めます私のビルドコマンド。

だから、依存チェーン、要するに、このように書きます:

lldap - > lgnutls - > lnettle。

私はlgnutlsを追加して、gnutlsの依存関係の問題を解決しましたが、私はnettle depencencyの問題を解決できません。

私の質問

は、私はこれらのイラクサ依存性の問題を解決する私の試みで間違っ何をしているのですか?

ボーナス質問

これらldリンカの依存関係を解決するためのベストプラクティスはありますか?

  1. 実行「未定義の参照」エラーのビルド
  2. ウォッチ
  3. (例えばnettle_sha1_digest =エラーをグーグルまたは参照名を見ることで、不足しているパッケージ図アウト:今、私の流れは次のようになりますイラクサパッケージ)
  4. は、そのパッケージをインストールし
  5. を繰り返し、私は魔法BULあります場合、私は思ったんだけど推測

それは私のためのすべての依存関係をインストールできますか? :)

答えて

1

あなたの依存ライブラリを間違った順序でリンクしています(詳細はWhy does the order in which libraries are linked sometimes cause errors in GCC?を参照してください)。

静的にリンクされたライブラリでは、ライブラリが指定された順序でシンボルを解決しようとします。依存しているシンボルがundefinedとして表示された場合、リンカは指定された後続ライブラリで定義されているかどうかを調べます。あなたのビルド呼び出しでは-lnettleが指定されているので、の前には-lgnutlsが必要です。これは、nettleから必要なシンボルを解決できません。

これは、最低でも-lnettleへの参照を-lgnutlsの後に移動する必要があることを意味します。あなたがリストしたすべてのリンク依存関係に精通していないので、これがあなたの問題のすべてを解決するかどうかは確かではありませんが、少なくとも現在実行しているエラーはgo buildです。

+0

また、あなたはこれらのリンカーフラグのすべてを追加するために抱えている主な理由は、あなたが静的にすべてをコンパイルしようとしているという事実です。動的リンクを使用していると仮定すると、共有ライブラリは自身の依存関係への参照を格納するため、リンカーフラグを追加することなく 'go build'を実行する必要があります。しかし、あなたがmuslを使用しているので、私はあなたが配布を容易にするためにこれを完全に静的にしようとしていると仮定していますか? – photoionized

関連する問題