2017-10-27 24 views
2

Golangには便利なライブラリがたくさんありますが、私はC++アプリケーションをサポートする必要があり、Golangに書き直すことはできません(大きすぎます)。golangの.aライブラリをC++プロジェクトから静的にリンクする方法は?

私は静的リンクによって私のC++アプリケーションからGoのライブラリ($GOPATH\pkg\path\to\package\*.aファイル)を使用しようとしています。

私は、単純なライブラリー(Golang)作るまず:

package math_core 
    func Sum(a, b int) int { 
     return a + b 
    } 

そして建てこのコード(このプロジェクトのルートフォルダにある)次のコマンドを経由して:

SET GOOS=windows 
    SET GOARCH=386 
    go build 
    go install 

を(結果として私はlibmath.core.aライブラリを持っています)

それを作った後このライブラリを使用しますication(C++):

#include <iostream> 
    extern int Sum(int a, int b); 
    int main() { 
     std::cout << Sum(5, 7) << std::endl; 
     return 0; 
    } 

私はこの記事をウェブでが見つかりました:

しかしそれは私を助けません。 C/C++開発者(Neon.3リリース4.6.3)

  • GCCのバージョン4.8.1 20130324(プレリリースのための

    • のWindows 10のx64
    • のEclipse IDE:SOFTWARE以下、私が使用し

      )(rubenvb-4.8-stdthread)

    • ゴーグラント島1.0 EAP(#1 GO-173.3415.23)
    • JRE 1.8.0_152リリース-1024-B6 AMD64
    • を構築
    • Go 1.9。2つのウィンドウ/ AMD64

    Z:\\MyProjects\\Math.Console\\フォルダの内容:

    g++ -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.cpp" 
        g++ "-LZ:\\MyProjects\\Math.Console" -o Math.Console.exe main.o -lmath.core 
    

    しかし、私:私がしようとして

    Files structure

    は、静的に、以下のコマンドを使用して、私のmath.consoleアプリケーションからlibmath.core.aライブラリをリンクしますこのOUTPUTを得た

    `Z:\MyProjects\Math.Console/libmath.core.a: could not read symbols: Archive has no index; run ranlib to add one 
    

    はまた、私は

    ar -xo libmath.core.a 
    

    経由ライブラリlibmath.core.aからobject files (*.o)を抽出しようとした私は、次のファイルだ:私が得た私はnmを経由してそれに内容を確認しようとすると

    __.PKGDEF 
        _go_.o 
        main.o 
    

    をこの:

    nm: __.PKGDEF: File format not recognized 
        nm: _go_.o: File format not recognized 
    

    そしてlibmath.core.aライブラリからmain.oファイルのため、私はこれを得た:

    00000000 b .bss 
    00000000 d .ctors 
    00000000 d .data 
    00000000 N .debug_abbrev 
    00000000 N .debug_aranges 
    00000000 N .debug_info 
    00000000 N .debug_line 
    00000000 N .debug_macro 
    00000000 N .debug_str 
    00000000 r .eh_frame 
    00000000 r .rdata$zzz 
    00000000 t .text 
         U ___main 
    00000058 t ___tcf_0 
    00000097 t __GLOBAL__sub_I_main 
         U __Z3Sumii 
    0000006a t __Z41__static_initialization_and_destruction_0ii 
         U __ZNSolsEi 
         U __ZNSolsEPFRSoS_E 
         U __ZNSt8ios_base4InitC1Ev 
         U __ZNSt8ios_base4InitD1Ev 
         U __ZSt4cout 
         U __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 
    00000000 b __ZStL8__ioinit 
         U _atexit 
    00000000 T _main 
    

    しかし、私は、私はC++プロジェクトからGolangのライブラリを使用する方法を理解していません。

    ありがとうございました。

  • +0

    は "また、私はオブジェクトファイル(* .o)は、ライブラリlibmath.core.aからを抽出しようとした私が得た... main.oを" 'main.o'ファイルがCから生成された++ソース。それは、ライブラリのアーカイブにあるであろう唯一の方法は、あなた自身そこに入れていましたさ。互換性のある名前の符号化 - – davmac

    +0

    はまた、私は非常にGoはC++を使用していることを疑います。一般的にはそれがいずれかのC++にはできませんので、(https://stackoverflow.com/questions/1713214/how-to-use-c-in-go)[直接Cから行くを呼び出すことが不可能]そうです。 – davmac

    答えて

    0

    エクスポートされた機能をmainパッケージに登録する必要があると思います。

    また、私はあなたがそのファイルに空のmain関数を持っている必要があると思います。

    func main() {}

    関連する問題