cgo(golang): ошибка: неполная ссылка на «привет»

Я просто пишу очень простую демонстрацию для проверки загрузки общей библиотеки с помощью кода cgo(golang).the следующим образом:

ххх.ч

#pragma once
void myprint(const char *str);

ххх.с

#include "xxx.h"
#include <stdio.h>
void myprint(const char *str) {
    printf("%s\n",str);
}

собрать общую библиотеку:

gcc -fPIC -shared xxx.c -o libxxx.so

хорошо, отсюда все в порядке.

теперь используйте cgo, загрузите libxxx.so и используйте функцию myprint:

package main

/*
#include <stdio.h>
#cgo linux CFLAGS: -I../../include
#cgo linux LDFLAGS: -L../../lib/linux -lxxx
#include "xxx.h"
*/
import "C"

funct main() {
    C.myprint(C.CString("xxx"))
}

затем создайте демонстрацию go:

go build test.go

как показывает мой заголовок:

error: undefined reference to 'myprint'

Я удостоверился, что путь к файлу lib/head указан правильно. Кто может помочь мне найти причину? спасибо.


person FreeApe    schedule 05.07.2016    source источник


Ответы (1)


Относительные пути не работают в контексте сборки, поскольку сборка происходит в каталоге, отличном от исходных файлов.

У вас есть несколько вариантов предоставления абсолютных путей:

  • Вы можете использовать абсолютные пути в вашем источнике
  • Вы можете использовать pkg-config для указания абсолютных путей
  • Вы можете использовать переменные среды CGO_CFLAGS и CGO_LDFLAGS
  • Вы можете использовать переменную ${SRCDIR} в строках #cgo исходного кода.

Дополнительные сведения см. в документации cgo.

person JimB    schedule 05.07.2016
comment
Я использую абсолютные пути в своем источнике или использую переменную ${SRCDIR} в #cgo, чтобы показать информацию: malformed #cgo argument - person FreeApe; 05.07.2016
comment
@FreeApe: искаженный аргумент #cgo — это искаженная строка, как говорится, или вы используете очень старую версию Go. Пожалуйста, сначала обновите это и укажите фактический пример в своем вопросе, если проблема все еще существует. - person JimB; 05.07.2016
comment
thx, вы сказали правильно. https://github.com/golang/go/issues/11868, и я попробуйте последнюю версию, все работает. - person FreeApe; 06.07.2016