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"'
私はlibnettle4
、nettle-dev
、libghc-nettle-dev
、nettle-bin
をインストールすることでこれを解決しようとしています。私は-lnettle
をldflagsに必ず含めました。運がない。
もっとコンテキスト
OpenLDAPのライブラリーは、コードでldap
とlber
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リンカの依存関係を解決するためのベストプラクティスはありますか?
- 実行「未定義の参照」エラーのビルド
- ウォッチ
- (例えば
nettle_sha1_digest
=エラーをグーグルまたは参照名を見ることで、不足しているパッケージ図アウト:今、私の流れは次のようになりますイラクサパッケージ) - は、そのパッケージをインストールし
- を繰り返し、私は魔法BULあります場合、私は思ったんだけど推測
それは私のためのすべての依存関係をインストールできますか? :)
また、あなたはこれらのリンカーフラグのすべてを追加するために抱えている主な理由は、あなたが静的にすべてをコンパイルしようとしているという事実です。動的リンクを使用していると仮定すると、共有ライブラリは自身の依存関係への参照を格納するため、リンカーフラグを追加することなく 'go build'を実行する必要があります。しかし、あなたがmuslを使用しているので、私はあなたが配布を容易にするためにこれを完全に静的にしようとしていると仮定していますか? – photoionized