2013-09-05 4 views
1

Я пытаюсь использовать внешнюю библиотеку C с моей программой Go.Cgo include archive .a file

Я попытался следующие:

package cgoexample 

/* 
#include <stdio.h> 
#include <stdlib.h> 

#cgo CFLAGS: -I/Users/me/somelib/include 
#cgo LDFLAGS: /Users/me/somelib/libhello.a 
#include "stinger.h" 
void myprint(char* s) { 
     printf("%s", s); 
} 
*/ 
import "C" 

import "unsafe" 
//... more here 

В /Users/me/somelib/include есть .h файл и в libhello.a есть файл .o (я проверил с помощью команды ar), который имеет определенные функции, в файле .h.

кажется, что .h файлы быть связаны в порядке, но это не выглядит как файл архива быть связаны между собой. Я продолжаю получать:

warning: 'some_method_in_my_h_file" declared 'static' but never defined 

И эти предупреждения рассматриваются как ошибки. Несмотря на это, они должны быть реализованы в архиве, поэтому я смущен тем, что я делаю неправильно.

Когда я бегу go build и gun run.

У меня есть чувство, моя #cgo команда недействительна (я не эксперт C),

+0

Вы можете добавить определения функций/деклараций? если объявленные thoses являются статическими, они должны быть определены и использоваться в файле, где они были объявлены. 'static' в определении функции сообщает компилятору не экспортировать вашу функцию за пределы файла. – tomahh

ответ

2

Право, это не работает с объектными ар архивами (*.a). Есть две вещи, которые вы можете сделать:

  • Ссылка его в качестве общей библиотеки (-lfoo в LDFLAGS, с libfoo.so в пути поиска библиотек)

  • Поместите *.c сами файлы в директории пакета Go , так что go build строит и связывает их в

Если вы готовы выйти из стандартного go build поведения, хотя, вы может распаковать *.a файл в отдельных объектных файлов, а затем имитировать поведение go build и cgo вручную.

Например, если построить тривиальное пакет ОЦП образца с опцией -x, вы должны увидеть вывод, подобный этому:

% go build -x 
(...) 
.../cgo (...) sample.go 
(...) 
gcc -I . -g (...) -o $WORK/.../_obj/sample.o -c ./sample.c 
(...) 
gcc -I . -g (...) -o $WORK/.../_obj/_all.o (...) $WORK/.../_obj/sample.o 
(...) 
.../pack grcP $WORK $WORK/.../sample.a (...) .../_obj/_all.o 
cd . 
.../6l -o $WORK/.../a.out (...) $WORK/.../sample.a 
(...) 

Таким образом, вы можете увидеть, что отдельные *.c файлы составляются по gcc, упакованные вместе в архив ar Go, а затем связанный по 6l. Вы можете сделать эти шаги вручную, а также, если по какой-то причине вы действительно не можете поместить *.c файлов в каталоге пакета и пусть go build обрабатывать их для вас (что было бы намного проще и дать людям шанс go get ING вашего пакета) ,

+0

На самом деле у меня есть список файлов .o в том же каталоге, который составил файл .a. Есть ли способ связать их все? – K2xL

+0

Возможно. Я отвечу выше, чтобы получить больше места. –

+0

Когда вы говорите каталог пакета ...Я помещаю их в каталог pkg, но, похоже, они не перечисляют их, когда я использую -x. Должен ли мой каталог pkg быть в пути или идти env или что-то еще? – K2xL