私は現在、を使用して、NOVAS Cパッケージ(天文学/天文学パッケージ)の Golangラッパーを構築しようとしていcgo
ます。NOVASは、ソースファイルを作業中のディレクトリ(コンパイルされたライブラリファイルは存在しない)に配置することで基本的に「インストール」されます。したがって、使用する.cファイル(フォルダー1にあります)を含める必要があると思います。.go
ファイルの下のディレクトリ。
そのため、それ自体で関数を呼び出すテスト.goプログラムを作成して、これをテストしようとしていますnovas.c
。ただし、プログラムはコンパイルに失敗します。これは、内に存在する関数への未定義の参照が複数あるためmath.h
です。math.h
.goファイルと使用するCファイルの両方に含まれているため、これは奇妙です。
go run novasTest.go
# command-line-arguments
/tmp/go-build681583835/b001/_x002.o: In function `equ2gal':
./Cdist/novas.c:1995: undefined reference to `sincos'
./Cdist/novas.c:1996: undefined reference to `sincos'
./Cdist/novas.c:2033: undefined reference to `atan2'
./Cdist/novas.c:2025: undefined reference to `atan2'
./Cdist/novas.c:2022: undefined reference to `sqrt'
/tmp/go-build681583835/b001/_x002.o: In function `era':
./Cdist/novas.c:3242: undefined reference to `fmod'
./Cdist/novas.c:3242: undefined reference to `fmod'
...(etcetera)
VirtualBox VMインスタンス内のUbuntu 18.04(x64)で実行しています。ここに特定の行がありませんか?
私の囲碁プログラムは次のようになります。
package main
/*
#include "Cdist/novas.h"
#include "Cdist/novas.c"
#include "Cdist/novascon.c"
#include "Cdist/nutation.c"
#include <math.h>
*/
import "C"
import "log"
func main() {
log.Println("Test of NOVAS function")
var JulianHigh C.double
var JulianLow C.double
...
var Z C.double
// Test values
JulianHigh = 2458953.5
JulianLow = 1.0
...
Z = -1.437110810486059E+03
vCel := make([]C.double,0) //Create the array to pass to the function.
vCel = append(vCel, X)
...
vTerFirst := &(vTer[0])
C.cel2ter(JulianHigh,JulianLow,DeltaT,Method,Accuracy,Option,PolarX,PolarY,vCelFirst,vTerFirst)
log.Println("C function completed processing.")
}
Cプログラムは大きすぎて含めることができないため、代わりにnovas.hファイルとnovas.cファイルの関連部分を表示します。
Cファイル:
/*
...
novas.c: Main library
...
*/
#ifndef _NOVAS_
#include "novas.h"
#endif
#include <math.h>
... //(other functions follow until the necessary one)
/********cel2ter */
short int cel2ter (double jd_ut_high, double jd_ut_low, double delta_t,
short int method, short int accuracy, short int option,
double xp, double yp, double *vec1,
double *vec2)
/*
------------------------------------------------------------------------
PURPOSE:
This function...
関数自体は、私が含めた他のファイルからの呼び出しを行う関数に依存していることに注意してください。
.hファイル:
/*
...
novas.h: Header file for novas.c
...
*/
#ifndef _NOVAS_
#define _NOVAS_
#ifndef __STDIO__
#include <stdio.h>
#endif
#ifndef __MATH__
#include <math.h>
#endif
#ifndef __STRING__
#include <string.h>
#endif
...
cの数学ライブラリとリンクするようにgoリンカーに指示するディレクティブが必要です。ヘッダーにmath.h
は、数学関数の実装は含まれていません。それらの宣言のみ(最初の近似まで)が含まれています。
とにかく、あなたはあなたのgoファイルのコメントにこの行を追加する必要があります:
#cgo LDFLAGS: -lm
-l
「このライブラリとリンクする」という意味でm
、Cの数学ライブラリの名前です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加