1 回答

TA貢獻(xiàn)2021條經(jīng)驗 獲得超8個贊
問題的核心是你的設(shè)置是錯誤的:你的Go代碼應(yīng)該在Cgo前綴中,只有你想要單獨編譯的任何C代碼的標(biāo)頭。例如:#include
package main
/*
#include "pmdk.h"
*/
import "C"
func main() {
C.helloWorld()
}
您可以將 C 代碼放入前綴中:
package main
/*
#include <stdio.h>
void helloWorld() {
printf("hello world from C\n");
}
*/
import "C"
...
但是,如果將 C 代碼放入單獨的文件(等)中,則應(yīng)創(chuàng)建一個小型頭文件,該文件僅聲明每個函數(shù),以及來自 C 代碼和 Go 代碼的頭文件。1prog.c#include
運(yùn)行:
go build
然后,如果 C 代碼已更改,則編譯 C 代碼,如果已更改,則生成 Go 代碼,并根據(jù)需要將兩者鏈接在一起。如果像以前一樣將 C 代碼直接放入 Go 包中,則將生成 C 代碼并生成包含 C 代碼的 Go 代碼,這就是獲取重復(fù)定義的原因。#includego build
您在 Cgo 標(biāo)頭中嵌入的任何 C 代碼都不應(yīng)出現(xiàn)在其他位置。這是放置小型“管道適配器”的好地方,如果您有一些現(xiàn)有的C代碼主要與Go一起使用,但需要一些調(diào)整。
1這是 C 中的一項常規(guī)技術(shù),用于確保函數(shù)的頭文件聲明與相同函數(shù)的 C 源定義一致。也就是說,標(biāo)頭可能會說:fifth.h
void func(int arg1, char *arg2);
另外,C代碼將顯示為:
#include "fifth.h"
void func(int zorg, char *evil) {
// ...
}
并且 C 編譯器將檢查聲明是否與定義匹配。
添加回答
舉報