質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
cgo

Cgoとは、Go言語からC言語の関数・型にアクセスするために使うパッケージです。GoからCのコードを呼び出すことができるため、Cで書かれたライブラリがGoでも再利用できます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

Q&A

解決済

1回答

2412閲覧

gormでsqliteを使用するcgo参照ありプログラムをWindowsからLinuxへクロスコンパイルしたい

inikuma

総合スコア1

cgo

Cgoとは、Go言語からC言語の関数・型にアクセスするために使うパッケージです。GoからCのコードを呼び出すことができるため、Cで書かれたライブラリがGoでも再利用できます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

0グッド

0クリップ

投稿2021/07/30 06:20

前提・実現したいこと

GORMでsqliteを用いたWindowsとLinuxの両方で使うプログラムを作っています。
プログラムをWindowsからLinux向けにクロスコンパイルしたかったのですが、sqliteを使用するために内部でcgoが使われていて失敗してしまいます。
よろしくお願いします。

発生している問題・エラーメッセージ

# runtime/cgo _cgo_export.c:1:0: error: -fPIC ignored for target (all code is position independent) [-Werror] /* Code generated by cmd/cgo; DO NOT EDIT. */ ^ cc1.exe: all warnings being treated as errors

該当のソースコード

go

1package main 2 3import ( 4 "gorm.io/driver/sqlite" 5 "gorm.io/gorm" 6 "log" 7) 8 9type Product struct { 10 gorm.Model 11 Code string 12 Price uint 13} 14 15func main() { 16 db, err := gorm.Open(sqlite.Open("./test.db"), &gorm.Config{}) 17 if err != nil { 18 log.Fatal(err) 19 } 20 21 db.AutoMigrate(&Product{}) 22 23}

設定した環境変数:

GOOS=linux GOARCH=amd64 CGO_ENABLED=1

試したこと

  • CGO_ENABLED=1 を設定する

エラーもバイナリも何も出力されていない状態から上記のエラーが表示されるようになりました。

  • database/sql に対応していて、cgo参照が無いライブラリを探す

まともに使えそうなものはありませんでした。

補足情報(FW/ツールのバージョンなど)

  • 使用している環境

Windows 10 Home 20H2 64bit
Go 1.16.5
TDM-GCC-x64
gorm 1.21.12

  • クロスコンパイルしたものを使いたい環境

Ubuntu 18.04.4 LTS x86_64

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下の条件を整えることが必要です。

  • Linux用バイナリを出力できるWindowsで動くGCC
  • そのGCCツールチェインを使うようにCC環境変数に上記のGCCコマンドパスを設定
  • 対象linux(ubuntu-18.04)と整合するバージョンのlibc相当のインストールと適切なCFLAGS環境変数の設定

これらを整えるにはかなりの知識が要求されます。実はLinuxは簡単な操作でこの条件を整えられるので意外と詳細にこの条件を整えるのはLinuxに慣れた方でも難しい。

より確実な解決方法はwsl2を使うかdockerを使うかです。
wsl2の場合はubuntu18.04の仮想環境と思ってもらえれば良いです。

おすすめはdockerを利用する方法です。

以下のようにコンパイル可能な環境(Dockerfileに書いてビルドしておくのをお勧めします)を整えてgo build .しましょう!

Dockerfile

shell

1FROM ubuntu:18.04 2RUN apt update 3RUN apt install -y libc6-dev curl git gcc 4# go1.16.6をインストール 5RUN curl -L https://golang.org/dl/go1.16.6.linux-amd64.tar.gz | tar xz -C /usr/local 6RUN ln -s /usr/local/go/bin/go /usr/local/bin/go

コマンド例
docker build --rm -t localhost/go1.16 .
docker run -it --rm -v カレントフォルダ絶対パス:/app -w /app localhost/go1.16 go build

補足

database/sql に対応していて、cgo参照が無いライブラリ

Postgres用のドライバーならあります: https://github.com/lib/pq
プロダクションには使えませんが実験的なCGO-FreeなSQLiteドライバー: https://modernc.org/sqlite

投稿2021/07/31 00:18

編集2021/07/31 00:32
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inikuma

2021/08/01 06:49

解答ありがとうございます。 cgoが絡むと複雑な条件を満たす必要があるんですね。 dockerを使う方法で無事にbuildすることができました。便利すぎて驚きました、、、 無事に解決できました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問