亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

CGo 不編譯 C 文件

CGo 不編譯 C 文件

躍然一笑 2022-09-26 19:31:33
我有一個非常簡單的設置:一個 .go 文件(測試.go)和一個 .c 文件 (PMDK.c)。我在Go中包含.c文件,如下所示:測試.go:package main/*#include "PMDK.c"#cgo pkg-config: libpmem*/import "C"func main() {    C.helloWorld()}當我運行 go run test.go 時,它只構建了一次。無論我對PMDK.c進行任何更改,我的程序每次都有完全相同的行為。我還嘗試了去構建test.go,這導致了同樣的結果。最后,在CGo不在同一目錄中編譯C文件之后,我只是去構建。這不起作用,因為我必須創建一個.mod文件(去構建測試.go)。然后,問題在于PMDK.c中的三個函數(helloWorld和其他兩個函數)應該被多次定義。我無法讓它構建我的更改。順便說一句,如果我將源文件復制/移動到另一個目錄并在那里構建它們,則更改將適用(僅一次,再次)。
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

問題的核心是你的設置是錯誤的:你的Go代碼應該在Cgo前綴中,只有你想要單獨編譯的任何C代碼的標頭。例如:#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 代碼放入單獨的文件(等)中,則應創建一個小型頭文件,該文件僅聲明每個函數,以及來自 C 代碼和 Go 代碼的頭文件。1prog.c#include


運行:


go build

然后,如果 C 代碼已更改,則編譯 C 代碼,如果已更改,則生成 Go 代碼,并根據需要將兩者鏈接在一起。如果像以前一樣將 C 代碼直接放入 Go 包中,則將生成 C 代碼并生成包含 C 代碼的 Go 代碼,這就是獲取重復定義的原因。#includego build


您在 Cgo 標頭中嵌入的任何 C 代碼都不應出現在其他位置。這是放置小型“管道適配器”的好地方,如果您有一些現有的C代碼主要與Go一起使用,但需要一些調整。


1這是 C 中的一項常規技術,用于確保函數的頭文件聲明與相同函數的 C 源定義一致。也就是說,標頭可能會說:fifth.h


void func(int arg1, char *arg2);

另外,C代碼將顯示為:


#include "fifth.h"


void func(int zorg, char *evil) {

    // ...

}

并且 C 編譯器將檢查聲明是否與定義匹配。


查看完整回答
反對 回復 2022-09-26
  • 1 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號