C ++リンクインジケータはextern "C"


Cを使用して1. C ++関数

例えばC、C ++標準ライブラリ標準ライブラリ、

cstdioを   
 / * * @file / cstdioを含ま
 これは、標準C ++ライブラリファイルであります*。あなたは、#includeこのファイルを@cすべき
 ではなく、「* .hの」実装ファイルのいずれかよりも、あなたのプログラムで*。
 * 
 *これは、標準のCライブラリのC ++バージョンヘッダ@c stdio.hのある
 *とその内容は(ほとんど)はヘッダと同じであるが、すべてれる
 *は名前を除いた名前空間@c STD(に含まれます定義された
 )Cのマクロとして*。
 * / 


  のextern  " C "  int型
  (のsnprintf)(CHAR *制限、size_tの、constの char型 *制限、...);

 

再度、簡単な例

- のmath.h

#ifndefの__MATH_H__
 の#define __MATH_H__ 

の#ifdef __cplusplus 
はextern  " C " {
 #endifの

INT FUNC(INTINT )。

#ifdef __cplusplus 
} 
#endifの

#endifの

 

- math.c

#include " のmath.h " 
INT FUNC(INT A、INT B)
{ 
    返す +のBと、
}

 

: -静的ライブラリにコンパイル
はgcc -c math.c -
*アルゴン-r librmath.aの.o -


- math.cpp

#include " のmath.h " 
の#include <iostreamの>
 使用して 名前空間STD;
 int型のmain()
{ 
    int型 A = 2、B = 3 ;
     INT C = FUNC(A、B);   // Cダイレクトコールインターフェイス 
    COUT << C << ENDL; 
}
  

 


-実行可能プログラムにコンパイル:
- G ++ math.cpp -L./ -lrmath

- ./a.out


:あなたは、にextern "C"、コンパイラタイムズリンクエラー追加しない場合は
未定義`FUNC(int型、int型)」に参考:Math.cpp :(テキスト+ 0x21での)
collect2は:LDは1つの終了ステータスを返しました


C ++、C言語へ2.エクスポート機能

- のmath.h

クラスサンプル{
     パブリックINT FUNC(INT A、INT B)。
}。

 

- math.cpp

#include " のmath.h " 
int型のサンプル:: FUNC(int型INT B)は
{ 
    返す +のBと、
}

 

- G ++ -fPIC -shared -g -o librmath.so math.cpp -I ./


コード・パッケージ書き込みC

- mymath.h

#ifdef __cplusplus
 はextern  " C " {
 #endifの

INT myfunc関数(INTINT )。

#ifdef __cplusplus 
} 
#endifの

 

- mymath.c

#include " mymath.h " 

の#include " のmath.h " 

INT myfunc関数(INT A、INT B)
{ 
    サンプルS。
    リターンs.func(B)
}

 

- G ++ -fPIC -shared -g -o libmymath.so mymath.cpp -lrmath -I ./ -L ./


テスト:
- main.cの

する#include <stdio.hに> 
の#include " mymath.h " 
int型のmain()
{ 
    のprintf(" %D \ n "、myfunc関数(12 ))。
    リターン 0 ; 
}

 

- gccのmain.cの-L./ -I ./ -lrmath -lmymath -Wl、-rpath = /

- ./a.out

 

あなたは、静的ライブラリとしてコンパイルしたい場合は:

G ++ -c math.cpp

-r当社librmath.a math.o

G ++ -c mymath.cpp 

-r当社libmymath.aのmymath.o

GCCのmain.c libmymath.a librmath.a -lstdc ++

二点

1. -lstdc ++

`__gxx_personality_v0' に未定義の参照

理由は次のとおりです。

C ++オブジェクト・ファイルを使用するプログラムは、常に適切なC ++ライブラリを供給するために、++グラムとリンクしなければならないことに注意してください。CコンパイラgccでC ++オブジェクトファイルをリンクしようとすると、C ++標準ライブラリ関数のために、「未定義の参照」エラーが発生します

C ++のソースファイルは、従来の1が、.C、.ccに、.cppファイル、.CPP、.C ++、.CP、または.CXXサフィックスを使用します。C ++ヘッダファイルは、しばしば.hh、.HPP、・H、又は(共有テンプレートコード用).tccを使用します。そして前処理C ++ファイルは接尾辞.ii使用しています。GCCは、これらの名前のファイルを認識し、あなたがコンパイラ(通常は名前のgccで)Cプログラムをコンパイルするためのと同じ方法を呼び出す場合でも、C ++プログラムとしてコンパイルします。

おそらくそれはとてもデフォルトで基本ライブラリ、C ++のリンクがない、標準ライブラリをリンクするgccの拡張子に基づいて、上記の例では、C ++、GCCを検出しないことを意味します。

 

これら三つの2 main.cのlibmymath.a librmath.a順序があるため、移動することはできません。

GNUリンカがライブラリを見たとき、それは必要としないことをすべてのシンボルを破棄します。.cppファイルがコンパイルされる前に、ライブラリが破棄されているので、この場合、あなたのライブラリーは、あなたの.cppファイルの前に表示されます。 

推奨される方法のダイナミックライブラリそう。

おすすめ

転載: www.cnblogs.com/tenyearboyue/p/12037824.html