About
C/C++をやっているとgolangで書けたらいいのにと思うことがよくあります. C/C++で書いたHello()
をgolangからcgoで呼び出してみます.
試してみた環境
version | |
---|---|
Ubuntu | 17.10 |
gcc | 7.2.0 |
golang | 1.8.3 |
C言語でHello World
c_hello.h
#ifndef C_HELLO_H_
#define C_HELLO_H_
void Hello(const char*);
#endif
c_hello.c
#include <stdio.h>
#include "c_hello.h"
void Hello(const char* name) {
printf("hello %s\n", name);
};
c_hello.go
package main
/*
#cgo LDFLAGS: ./chello.o
#include "chello.h"
*/
import "C"
func main() {
C.Hello(C.CString("Qiita"))
}
コンパイル&実行
% gcc c_hello.c -c
% go run c_hello.go
% hello Qiita
C++でHello World
hello.hpp
#ifndef HELLO_H_
#define HELLO_H_
#ifdef __cplusplus
extern "C" {
#endif
void Hello(const char*);
#ifdef __cplusplus
}
#endif
#endif
hello.cpp
#include <cstdio>
#include "hello.hpp"
void Hello(const char* name) {
std::printf("hello %s\n", name);
};
hello.go
package main
/*
#cgo LDFLAGS: ./hello.o
#include "hello.hpp"
*/
import "C"
func main() {
C.Hello(C.CString("Qiita"))
}
コンパイル&実行
% gcc -lstdc++ hello.cpp -c
% go run hello.go
% hello Qiita
所感
-
#cgo
で結構エラーで詰まったが, LDFLAGSにオブジェクトファイルを指定するだけでよかった. - `import "C"の上のコメントアウトしているCコードとの間に空行があるとエラーになる.