繁体   English   中英

使用 cgo 使用 bazel 构建并运行 Go

[英]Build and run Go using cgo using bazel

页面上有一个简单的 cgo 项目。 它依赖于预构建的 c 共享库,并且在使用go build时效果很好,只需稍作更改即可构建。

我想用 Bazel 做同样的事情。

使用的源代码与此github 链接上的相同,不使用 hello.c 文件。 总而言之,最终代码如下所示。

/*
 * person.c
 * Copyright (C) 2019 Tim Hughes
 *
 * Distributed under terms of the MIT license.
 */

#include <stdlib.h>
#include "person.h"

APerson *get_person(const char *name, const char *long_name)
{

    APerson *fmt = malloc(sizeof(APerson));
    fmt->name = name;
    fmt->long_name = long_name;

    return fmt;
};
/*
 * person.h
 * Copyright (C) 2019 Tim Hughes
 *
 * Distributed under terms of the MIT license.
 */

#ifndef PERSON_H
#define PERSON_H

typedef struct APerson
{
    const char *name;
    const char *long_name;
} APerson;

APerson *get_person(const char *name, const char *long_name);

#endif /* !PERSON_H */

package main

/*
#cgo CFLAGS: -g -Wall
#cgo LDFLAGS: -L. -lperson
#include "person.h"
*/
import "C"

import (
    "github.com/kubernetes/klog"
)

type (
    Person C.struct_APerson
)

func GetPerson(name string, long_name string) *Person {
    return (*Person)(C.get_person(C.CString(name), C.CString(long_name)))
}

func main() {
    klog.Info("it is running")
    var f *Person
    f = GetPerson("tim", "tim hughes")
    klog.Infof("Hello Go world: My name is %s, %s.\n", C.GoString(f.name), C.GoString(f.long_name))
}

Bazel 构建文件如下。

load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")

go_library(
    name = "listing_lib",
    srcs = [
        "person.c",
        "person.h",
        "runner.go",
    ],
    cgo = True,
    clinkopts = ["-Lpersons/listing -lperson"],
    copts = ["-g -Wall"],
    importpath = "github.com/example/project/persons/listing",
    visibility = ["//visibility:private"],
    deps = ["@com_github_kubernetes_klog//:klog"],
)

go_binary(
    name = "listing",
    embed = [":listing_lib"],
    visibility = ["//visibility:public"],
)

仍然在通过运行bazelisk build //persons/listing时,会发生错误,这是一般的 linker 错误。

/usr/bin/ld.gold: error: cannot find -lperson
collect2: error: ld returned 1 exit status
compilepkg: error running subcommand /usr/bin/gcc: exit status 1

我需要一些东西来清理。

  • c 库是自动构建的吗? 我的假设是那些不是。
  • 如果不是,那为什么是-L. 如果构建的 lib 与 go 文件的文件夹相同,则不起作用? 假设 bazel 在源文件夹中看不到库,但在错误的位置查找。
  • 是否可以使用 cc_library 规则来构建可在 cgo 中使用的共享库? 如果是这样,如何连接这些?

c 库是自动构建的吗? 我的假设是那些不是。

为什么? 来自官方 repo 的测试显示,它是自动完成

是否可以使用 cc_library 规则来构建可在 cgo 中使用的共享库? 如果是这样,如何连接这些?

这里查看示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM