math.hにリンクするCライブラリでGolangのcgoをどのように使用しますか?

次の場合:

私は現在、を使用して、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]

編集
0

コメントを追加

0

関連記事

分類Dev

Javascript Mathライブラリを使用して直角三角形の角度を計算するにはどうすればよいですか?

分類Dev

Cのmath.hライブラリを使用する単一のexeに2つのファイルをコンパイルするためのコマンドラインは何ですか

分類Dev

どのようにmath.randomを使用してランダムな整数を生成しますか?

分類Dev

プレインストールされたPythonのライブラリをrequirements.txt(NumPy、mathなど)に配置する必要がありますか?

分類Dev

math.hとライブラリリンク-lmを使用しても「powへの未定義の参照」

分類Dev

VBでライブラリMath.NetのIntegrate.OnClosedIntervalを使用する方法は?

分類Dev

「Math.random()* arr.length | 0」が配列のランダムインデックスを返すためにどのように機能するか

分類Dev

Java Mathライブラリに浮動小数点を返す関数がないのはなぜですか?

分類Dev

Scannerのようなクラスをインポートする必要があるのに、Math(Eclipse)のようなクラスをインポートしないのはなぜですか

分類Dev

Math.random()を使用して2Dブール配列をどのように設定しますか?(マインスイーパQn)

分類Dev

math.hライブラリを使用しないSin関数

分類Dev

Math.max.apply()はどのように機能しますか?

分類Dev

java.math.RoundingModeはどのように機能しますか?

分類Dev

math.minはどのように機能しますか

分類Dev

Math.random()をよりランダムにしますか?

分類Dev

<cmath>はC ++ 14 / C ++ 11の<math.h>でisnanを非表示にしますか?

分類Dev

Math.random()はJavaでどのように正確に機能しますか?

分類Dev

Math.random()*50 + Math.random()*20 の分布は、Math.random()*70 とどのように比較されますか?

分類Dev

math.hをgprbuildにリンクする

分類Dev

JS:Math.random()の使用中に値の範囲を除外するにはどうすればよいですか?

分類Dev

JavaScriptでMathオブジェクトのプロパティをウィンドウに公開するにはどうすればよいですか?

分類Dev

math.hを含むCライブラリをg ++ 7(Raspberry PI)で使用することはできません

分類Dev

math.atan2関数を使用して、オブジェクトが別のオブジェクトの「視線」内にあるかどうかを検出するにはどうすればよいですか?

分類Dev

JAVAのMath.roundで欲しいものを取得するにはどうすればよいですか?

分類Dev

オブジェクトの配列でMath.maxを使用するにはどうすればよいですか?

分類Dev

Math.random()を使用して、10位までの数値を生成するにはどうすればよいですか?

分類Dev

日付のMath.MinとMath.Maxに相当しますか?

分類Dev

golang math / bigライブラリの奇妙な構文

分類Dev

Opencl mathオクターブをopenclまたはcに変換しようとするopenclの新機能で、異なる結果が得られます

Related 関連記事

  1. 1

    Javascript Mathライブラリを使用して直角三角形の角度を計算するにはどうすればよいですか?

  2. 2

    Cのmath.hライブラリを使用する単一のexeに2つのファイルをコンパイルするためのコマンドラインは何ですか

  3. 3

    どのようにmath.randomを使用してランダムな整数を生成しますか?

  4. 4

    プレインストールされたPythonのライブラリをrequirements.txt(NumPy、mathなど)に配置する必要がありますか?

  5. 5

    math.hとライブラリリンク-lmを使用しても「powへの未定義の参照」

  6. 6

    VBでライブラリMath.NetのIntegrate.OnClosedIntervalを使用する方法は?

  7. 7

    「Math.random()* arr.length | 0」が配列のランダムインデックスを返すためにどのように機能するか

  8. 8

    Java Mathライブラリに浮動小数点を返す関数がないのはなぜですか?

  9. 9

    Scannerのようなクラスをインポートする必要があるのに、Math(Eclipse)のようなクラスをインポートしないのはなぜですか

  10. 10

    Math.random()を使用して2Dブール配列をどのように設定しますか?(マインスイーパQn)

  11. 11

    math.hライブラリを使用しないSin関数

  12. 12

    Math.max.apply()はどのように機能しますか?

  13. 13

    java.math.RoundingModeはどのように機能しますか?

  14. 14

    math.minはどのように機能しますか

  15. 15

    Math.random()をよりランダムにしますか?

  16. 16

    <cmath>はC ++ 14 / C ++ 11の<math.h>でisnanを非表示にしますか?

  17. 17

    Math.random()はJavaでどのように正確に機能しますか?

  18. 18

    Math.random()*50 + Math.random()*20 の分布は、Math.random()*70 とどのように比較されますか?

  19. 19

    math.hをgprbuildにリンクする

  20. 20

    JS:Math.random()の使用中に値の範囲を除外するにはどうすればよいですか?

  21. 21

    JavaScriptでMathオブジェクトのプロパティをウィンドウに公開するにはどうすればよいですか?

  22. 22

    math.hを含むCライブラリをg ++ 7(Raspberry PI)で使用することはできません

  23. 23

    math.atan2関数を使用して、オブジェクトが別のオブジェクトの「視線」内にあるかどうかを検出するにはどうすればよいですか?

  24. 24

    JAVAのMath.roundで欲しいものを取得するにはどうすればよいですか?

  25. 25

    オブジェクトの配列でMath.maxを使用するにはどうすればよいですか?

  26. 26

    Math.random()を使用して、10位までの数値を生成するにはどうすればよいですか?

  27. 27

    日付のMath.MinとMath.Maxに相当しますか?

  28. 28

    golang math / bigライブラリの奇妙な構文

  29. 29

    Opencl mathオクターブをopenclまたはcに変換しようとするopenclの新機能で、異なる結果が得られます

ホットタグ

アーカイブ