当前位置: 首页 > 知识库问答 >
问题:

在 C 语言中使用 Go

倪棋
2023-03-14

linux Debian Buster

go版本go1.11.6 linux/amd64

gcc版本8.3.0(Debian 8.3.0-6)

libmylib.go

package main

import "C"

import (
    "fmt"
)

func say(text string) {
    fmt.Println(text)
}

func main(){}

mylib.h

#ifndef MY_LIB_H
#define MY_LIB_H

#include <string>

void say(std::string text);

#endif

主.cpp

#include <string>
#include "mylib.h"

using namespace std;

int main() {
    string text = "Hello, world!";

    say(text);

    return 0;
}

CGO _ ENABLED = 1 go build-o libmylib . so-build mode = c-shared libmylib . go

g -L/路径/到/库/ -利米利布 main.cpp -o 我的测试程序

/usr/bin/ld: /tmp/ccu4fXFB.o:在函数“main”中:main.cpp:(。text 0x53):对` say(std::__cxx11::basic_string)的未定义引用

有变化:包主-

CGO _ ENABLED = 1 go build-o libmylib . so-build mode = c-shared libmylib . go

-buildmode=c-shared只需要一个主包


共有2个答案

潘振国
2023-03-14
g++ -L/path/to/lib/ -lmylib main.cpp -o test

很可能是错的。阅读GCC文档的调用GCC章节。< code>g 的参数顺序非常重要。

此外,test(1)可能是一些现有的可执行文件。我建议使用其他名称。

所以考虑用

g++ -Wall -g -O main.cpp -L/path/to/lib/ -lmylib -o my-test-program

您可能需要调试信息(< code>-g)、警告(< code>-Wall)和一些优化信息(< code>-O)

你做了评论

我需要在C项目中使用Go文件中的一些函数。

这很奇怪。我假设你的操作系统Linux。那么,你不能在运行Go程序的进程和运行C程序的另一个进程之间使用进程间通信工具吗?考虑一下在它们之间使用JSONRPC或HTTP。Go和C中有几个开源库可以帮助你。

正如我所评论的,从Go程序调用C代码要简单得多。当然,您需要阅读Go文档和关于cgo的博客,可能还需要阅读C dlopen minihowto和一些C参考。

锺离浩慨
2023-03-14
匿名用户

你必须在C版本中使用< code>GoString而不是< code>std::string。您得到的错误消息是因为类型不匹配,表现为链接时错误。

请参见cgo参考。

这是一个工作示例。与您的示例有一些不同之处。//export指令需要将函数包含在生成的头文件中,参数是*C.char而不是stringGoString。C代码使用cgo生成的头文件,并且必须从静态字符串中删除const强制转换(因为go没有类似C的const)。

package main

import "C"

import (
    "fmt"
)

//export say
func say(text *C.char) {
    fmt.Println(C.GoString(text))
}

func main() {}
#include "libmylib.h"

int main(void) {
    say(const_cast<char*>("hello world"));

    return 0;
}

编译到go文件,在当前目录中生成libmylib.solibmylib. h

go build -o libmylib.so -buildmode=c-shared libmylib.go

编译C程序,将其链接到上面的共享库:

g++ -L. main.cpp -lmylib -o hello_program

要运行该程序,需要将LD_LIBRARY_PATH设置为当前目录。如果安装了程序并将共享库放在一个合理的位置,那就不同了。

LD_LIBRARY_PATH=. ./hello_program

 类似资料:
  • 在 Go 代码中通过 //export Go函数名称 导出Go的函数名称 在 C 代码中通过 extern 返回值类型 Go函数名称(形参列表); 声明 Go 中导出的函数名称 注意://export Go 函数名称 和 extern 返回值类型 Go函数名称(形参列表); 不能在同一个文件中 package main import "C" import "fmt" // 导出Go函数声

  • 在 Go 语言开篇中我们已经知道,Go 语言与 C 语言之间有着千丝万缕的关系,甚至被称之为 21 世纪的C语言。 所以在 Go 与 C 语言互操作方面,Go 更是提供了强大的支持。尤其是在 Go 中使用 C,你甚至可以直接在 Go 源文件中编写 C 代码,这是其他语言所无法望其项背的。 格式: 在 import "C" 之前通过单行注释或者通过多行注释编写C语言代码 在 import "C" 之

  • 主要内容:字符的表示,字符的输出,字符与整数,再谈字符串前面我们多次提到了字符串,字符串是多个字符的集合,它们由 包围,例如 、 。字符串中的字符在内存中按照次序、紧挨着排列,整个字符串占用一块连续的内存。 当然,字符串也可以只包含一个字符,例如 、 ;不过为了操作方便,我们一般使用专门的字符类型来处理。 初学者经常用到的字符类型是 char,它的长度是 1,只能容纳 ASCII 码表中的字符,也就是英文字符。 要想处理汉语、日语、韩语等英文之外的字符

  • 如果在这个程序中,我正在输入一个大小7.so的数组从main()merge_sort(arr,0,6)被传递到相应的函数后,条件被检查,如果(0 但我能够理解合并排序(arr,mid1,high);有人打电话吗?但这个程序运行良好。请解释编译器如何调用merge_sort(arr、mid 1、high)

  • 本文向大家介绍Objective-C语言使用C字符串,包括了Objective-C语言使用C字符串的使用技巧和注意事项,需要的朋友参考一下 示例 转换NSString为const char使用-[NSString UTF8String]: -[NSString cStringUsingEncoding:]如果您的字符串使用非UTF-8编码,则也可以使用。 对于反向路径,请使用-[NSString

  • 本文向大家介绍windows中使用C# 调用 C语言生成的dll,包括了windows中使用C# 调用 C语言生成的dll的使用技巧和注意事项,需要的朋友参考一下 首先建立一个C语言源文件test.c 然后下载mingw64,解压,进入到bin目录,查看是否有gcc.exe ,只要下载正确肯定是有的,可以把这个bin目录加入环境变量,就可以在任意地方运行gcc。偷懒的做法是直接把刚才做好的test