第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

CGo 不編譯 C 文件

CGo 不編譯 C 文件

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

1 回答

?
寶慕林4294392

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 編譯器將檢查聲明是否與定義匹配。


查看完整回答
反對 回復(fù) 2022-09-26
  • 1 回答
  • 0 關(guān)注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號