看起来我不能使用Cgo去调用在另一个目录中声明的C函数,而不是当前Go包中声明的。
所有文件的代码:
// TestGoCallOC.go
package 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主函数时,这两个C函数可以被调用。
但如果我将C文件(实际上是Objective-C文件)放在另一个目录中:
|--src
|--TestGoCallOC
|--TestGoCallOC.go
|--SomeOCCodes
|--test.h
|--test.m
请将头文件#include "test.h"
的文件路径更改为其绝对路径,并运行Go主函数,否则这两个C函数将无法调用。
错误信息如下:
Undefined symbols for architecture x86_64: "_fortytwo", referenced from: __cgo_b3674ecbf56b_Cfunc_fortytwo in TestGoCallOC.cgo2.o (maybe you meant: __cgo_b3674ecbf56b_Cfunc_fortytwo) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) exit status 2
我做错了什么吗?或者Cgo不能做到这一点吗?
#include "../../test.m"
,然后我可以调用这些C函数。但为什么#include
头文件不起作用? - Buqian Zheng