为了账号安全,请及时绑定邮箱和手机立即绑定

Cgo 可以调用在另一个目录中声明的 C 函数吗?

Cgo 可以调用在另一个目录中声明的 C 函数吗?

Go
幕布斯7119047 2022-01-17 18:38:40
似乎我不能使用 Cgo 调用在另一个目录而不是当前 Go 包中声明的 C 函数。所有文件的代码:// TestGoCallOC.gopackage main/*#include "test.h"#cgo CFLAGS: -x objective-c#cgo LDFLAGS: -framework Foundation*/import "C"import (    "fmt")func main()  {    fmt.Println(C.fortytwo())}// test.h#include <stdio.h>#include <stdlib.h>int fortytwo();// test.m#include "test.h"int fortytwo() {    return 42;}如果我将所有文件放在一个目录中:|--src   |--TestGoCallOC      |--TestGoCallOC.go      |--test.h      |--test.m并运行 Go main 函数,这两个 C 函数可以被调用。但是,如果我将 C 文件(实际上它们是 Objective-C 文件)放在另一个目录中:|--src   |--TestGoCallOC      |--TestGoCallOC.go   |--SomeOCCodes      |--test.h      |--test.m,将前导中的文件路径改成#include "test.h"绝对路径,运行Go main函数,这两个C函数调用不了。错误信息是架构 x86_64 的未定义符号:“_fortytwo”,引用自:TestGoCallOC.cgo2.o 中的 __cgo_b3674ecbf56b_Cfunc_fortytwo(也许您的意思是:__cgo_b3674ecbf56b_Cfunc_fortytwo)ld:未找到架构 x86_64 的符号 clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)退出状态 2我做错什么了吗?还是Cgo没有能力做到这一点?
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

根据https://golang.org/cmd/cgo/

包中的所有 cgo CPPFLAGS 和 CFLAGS 指令被连接起来并用于编译该包中的 C 文件。包中的所有 CPPFLAGS 和 CXXFLAGS 指令被连接起来并用于编译该包中的 C++ 文件。程序中任何包中的所有 LDFLAGS 指令都在链接时连接并使用。所有 pkg-config 指令被连接起来并同时发送到 pkg-config 以添加到每个适当的命令行标志集。


Go 包边界是 src 文件夹,因此您可以将所有 c 文件放在同一文件夹中/或使用包含 C 文件(不是 h 文件)解决方法,如下所示:


// main.go

package main


//#include "../ctest/test.c"

import "C"

import "fmt"


func main() {

    r := C.Add(10, 20)

    fmt.Println(r)

}

和 ctest 目录中的 c 文件:


//test.c


int Add(int a, int b){

    return a+b;

}

这很好用。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信