Go語言調用C語言函數的坑

最近在看人民郵電出版社 許式偉 呂桂華編著的《Go語言編程》,看到【1.2.9 語言交互性】小節的cprint.go。未按照書中源代碼格式編寫,而是把 import "C" 和 import "unsafe" 合併放入小括號中並和註釋結束符 */ 間隔了一行,這也是大多數Go語言學習和開發者常用的代碼風格,我修改後的代碼以下:golang

package main

/*
#include <stdio.h>
#include <stdlib.h>
*/

import (
    "C"
    "unsafe"
)

func main() {
    cstr := C.CString("Hello, world")
    C.puts(cstr)
    C.free(unsafe.Pointer(cstr))
}

編程

結果在個人Windows 7 64位和CentOS 6.6 x86_64環境下go build cprint.go或者go run cprint.go都一直報錯以下:學習

# command-line-arguments
error: 'puts' undeclared (first use in this function)
error: 'free' undeclared (first use in this function)ui

查找了不少文檔,研究了3天,一直未找到緣由,包括換成舊版Go語言SDK,也未能解決。this

偶爾看到一篇英文文檔,地址:http://stackoverflow.com/questions/18237738/linking-golang-with-xlib,提示導入虛擬包C的格式必須單獨起一行,而且緊跟在註釋結束行後,因而從新按照提示修改後編譯和運行都經過了,嚴格按照《Go語言編程》書本格式編寫也正常。spa

修改後正常的代碼以下:blog

package main

/*
#include <stdio.h>
#include <stdlib.h>
*/
import "C"

import (
    "unsafe"
)

func main() {
    cstr := C.CString("Hello, world")
    C.puts(cstr)
    C.free(unsafe.Pointer(cstr))
}
   
開發

Go語言的代碼格式很是嚴格,廣大Go語言愛好者有時常常不當心修改了格式或者使用了其餘語言風格格式,編譯和運行都有可能出現各類莫名其妙的問題。再次提醒你們:import "C" 必定要緊跟C語言代碼註釋結束的最後一行,絕對不能空出一行,也不能和其餘包合併寫到import小括號內。文檔

   

本文出自 「鬆鬆」 博客,請務必保留此出處http://dongsong.blog.51cto.com/916653/1587363get

相關文章
相關標籤/搜索