如何在没有定义 main() 的情况下让 cgo 构建目标文件?
How do I get cgo to build object files without main() being defined?
我有一个完全用 C 编写的项目。我只需要调用一个必须用 GO 编写的函数。因此,我正在使用 cgo 构建 C 文件,然后我想将生成的目标文件用于 link 我的主 C 项目。
假设我有一个文件 foo.go
,只有一个函数 func HelloWorld()
。我想从我的 C 代码中执行这个函数。
所以我执行以下步骤
# go tool cgo foo.go
# cd _obj && gcc -c *.o
现在我有两个文件:
# _cgo_export.o _cgo_main.o
但是,main()
以某种方式在那里定义,我不能 link 这些目标文件与我的主项目(多个主)。
如何让 cgo 不放入虚拟 main?还是我这样做完全错了?
编辑我需要入口点在 C 中。其他人发布的建议要求入口点在 GO 中。我已经在下面发布了正确的解决方案,感谢我记入的另一位用户。
@alexander (https://whosebug.com/users/131264/alexander) 的回答解决了问题。
用gccgo就不是乱命题了。这在这里有效:
foo.go
package main
func Add(a, b int) int {
return a + b
}
bar.c
#include <stdio.h>
extern int go_add(int, int) __asm__ ("example.main.Add");
int main() {
int x = go_add(2, 3);
printf("Result: %d\n", x);
}
生成文件
all: main
main: foo.o bar.c
gcc foo.o bar.c -o main
foo.o: foo.go
gccgo -c foo.go -o foo.o -fgo-prefix=example
clean:
rm -f main *.o
我有一个完全用 C 编写的项目。我只需要调用一个必须用 GO 编写的函数。因此,我正在使用 cgo 构建 C 文件,然后我想将生成的目标文件用于 link 我的主 C 项目。
假设我有一个文件 foo.go
,只有一个函数 func HelloWorld()
。我想从我的 C 代码中执行这个函数。
所以我执行以下步骤
# go tool cgo foo.go
# cd _obj && gcc -c *.o
现在我有两个文件:
# _cgo_export.o _cgo_main.o
但是,main()
以某种方式在那里定义,我不能 link 这些目标文件与我的主项目(多个主)。
如何让 cgo 不放入虚拟 main?还是我这样做完全错了?
编辑我需要入口点在 C 中。其他人发布的建议要求入口点在 GO 中。我已经在下面发布了正确的解决方案,感谢我记入的另一位用户。
@alexander (https://whosebug.com/users/131264/alexander) 的回答解决了问题。
用gccgo就不是乱命题了。这在这里有效:
foo.go
package main
func Add(a, b int) int {
return a + b
}
bar.c
#include <stdio.h>
extern int go_add(int, int) __asm__ ("example.main.Add");
int main() {
int x = go_add(2, 3);
printf("Result: %d\n", x);
}
生成文件
all: main
main: foo.o bar.c
gcc foo.o bar.c -o main
foo.o: foo.go
gccgo -c foo.go -o foo.o -fgo-prefix=example
clean:
rm -f main *.o