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只需要一个主包
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参考。
你必须在C版本中使用< code>GoString而不是< code>std::string。您得到的错误消息是因为类型不匹配,表现为链接时错误。
请参见cgo参考。
这是一个工作示例。与您的示例有一些不同之处。//export
指令需要将函数包含在生成的头文件中,参数是*C.char
而不是string
或GoString
。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.so
和libmylib. 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