Я уже несколько дней искал несколько предложений, но ни один не помог. На данный момент я просто хочу создать небольшой фрагмент Go, который подключается к базе данных Oracle. Хотя все работает с использованием обычного go build
и вызова результирующего динамически связанного приложения, я застреваю, когда пытаюсь запустить статический компилятор. У меня уже есть статические проекты (даже с CGO) без проблем, но здесь gcc не находит библиотеку oracle. Может, у кого-то есть намек?Попытка создания статического исполняемого файла CGO с библиотеками oracle на Linux/Ubuntu
Ошибки во время сборки:
host link: "gcc" "-m64" "-gdwarf-2" "-o" "/tmp/go-build319417544/command-line-arguments/_obj/exe/a.out" "-static" "/tmp/go-link-116023228/000000.o" "/tmp/go-link-116023228/000001.o" "/tmp/go-link-116023228/000002.o" "/tmp/go-link-116023228/go.o" "-g" "-O2" "-g" "-O2" "-lpthread" "-g" "-O2" "-L/usr/lib/oracle/12.1/client64/lib" "-lclntsh" "-static"
/home/hannes/.gvm/gos/go1.5/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: cannot find -lclntsh
collect2: error: ld returned 1 exit status
команды Построить код
CGO_ENABLED=1 go build -work -x -ldflags " -v -linkmode external -extldflags -static" ${MAIN_SRC}
Применения:
package main
/*
// #cgo CFLAGS: -I/usr/lib/oracle/12.1/client64/include
// #cgo LDFLAGS: -L/usr/lib/oracle/12.1/client64/lib -lclntsh
*/
import "C"
import (
"fmt"
"database/sql"
_ "github.com/mattn/go-oci8"
"time"
)
func main(){
db, err := sql.Open("oci8", "...")
...
}
Я проверил с
dconfig -p | grep cln
libkadm5clnt_mit.so.9 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libkadm5clnt_mit.so.9
libclntshcore.so.12.1 (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntshcore.so.12.1
libclntshcore.so (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntshcore.so
libclntsh.so.12.1 (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1
libclntsh.so (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntsh.so
динамического построения исполняемого файла (просто «идти строить oracle_test.go) есть все необходимое:
ldd oracle_test
linux-vdso.so.1 => (0x00007ffeac867000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f083ef82000)
libclntsh.so.12.1 => /usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1 (0x00007f083bfc5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f083bbfa000)
/lib64/ld-linux-x86-64.so.2 (0x00005615b32e8000)
libmql1.so => /usr/lib/oracle/12.1/client64/lib/libmql1.so (0x00007f083b984000)
libipc1.so => /usr/lib/oracle/12.1/client64/lib/libipc1.so (0x00007f083b606000)
libnnz12.so => /usr/lib/oracle/12.1/client64/lib/libnnz12.so (0x00007f083aefb000)
libons.so => /usr/lib/oracle/12.1/client64/lib/libons.so (0x00007f083acb6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f083aab2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f083a7a9000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f083a58f000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f083a387000)
libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007f083a184000)
libclntshcore.so.12.1 => /usr/lib/oracle/12.1/client64/lib/libclntshcore.so.12.1 (0x00007f0839c12000)
Я также попытался поставить/экспорт CGO_LDFLAGS и/ORD переменную среды LD_LIBRARY_PATH, которая не помогло.
PKG-конфигурации показывает, а в библиотеке
pkg-config --libs oci8
-L/usr/lib/oracle/12.1/client64/lib -lclntsh
После просмотра для статических библиотек, я устанавливал полный пакет базы данных Oracle и теперь у меня есть еще несколько файлов в LIB папке: ls /usr/lib/oracle/12.1/client64/lib/lib*.a
-rw-r--r-- 1 1424782 /usr/lib/oracle/12.1/client64/lib/libagent12.a -rw-r--r-- 1 1962088 /usr/lib/oracle/12.1/client64/lib/libasmclnt12.a -rw-r--r-- 1 2187864 /usr/lib/oracle/12.1/client64/lib/libasmclntsh12.a -rw-r--r-- 1 11386 /usr/lib/oracle/12.1/client64/lib/libasmperl12.a -rw-r--r-- 1 28454 /usr/lib/oracle/12.1/client64/lib/libavstub12.a -rw-r--r-- 1 7408322 /usr/lib/oracle/12.1/client64/lib/libcell12.a -rw-r--r-- 1 11246008 /usr/lib/oracle/12.1/client64/lib/libclient12.a -rw-r--r-- 1 0 /usr/lib/oracle/12.1/client64/lib/libclntst12.a -rw-r--r-- 1 1749282 /usr/lib/oracle/12.1/client64/lib/libclsr12.a -rw-r--r-- 1 10087032 /usr/lib/oracle/12.1/client64/lib/libcommon12.a -rw-r--r-- 1 5803698 /usr/lib/oracle/12.1/client64/lib/libcore12.a -rw-r--r-- 1 6051402 /usr/lib/oracle/12.1/client64/lib/libctx12.a -rw-r--r-- 1 1201840 /usr/lib/oracle/12.1/client64/lib/libctxc12.a -rw-r--r-- 1 56964 /usr/lib/oracle/12.1/client64/lib/libctxs12.a ...snipped...
Как видно, один файл имеет нулевой размер, поэтому мне пришлось запускать $ ORACLE_HOME/bin/genclntst для генерации libclntst12.a.
Вы не указали, если '/ usr/lib/oracle/12.1/client64/lib/'содержит статические библиотеки для всего, что вам нужно (или если у системы есть статические версии ее зависимостей, но это более вероятно) – JimB
Привет, я должен признать, что мне не нужно много знать, когда дело доходит до компиляции статические программы. Итак, вот мой каталог: 'Ls /usr/lib/oracle/12.1/client64/lib/ glogin.sql libclntsh.so libclntsh.so.12.1 libclntshcore.so libclntshcore.so.12.1 libipc1. так libmql1.so libnnz12.so libocci.so libocci.so.12.1 libociei.so libocijdbc12.so libons.so liboramysql12.so libsqlplus.so libsqlplusic.so ojdbc6.jar ojdbc7. jar ottclasses.zip xstreams.jar ' – hanneslehmann