2017-08-07 2 views
0

私は/usr/include/gifti/usr/include/giftilibgiftiio.a/usr/libのライブラリファイル(giftiio)を持っています。リンカがオブジェクトファイルを見つけたにもかかわらず、私のプログラムで関数定義が見えないのはなぜですか?

私は簡単なプログラム、read_hemi.ccでそれを使用しよう:

と、次のエラーを取得::私は、その後でこのプログラムをコンパイルしよう

#include <gifti_io.h> 

int main(const int argc, const char *argv[]) { 
    gifti_image *out_im; 
    gifti_disp_lib_version(); 
} 

/tmp/ccqWBaLb.o: In function `main': 
read_hemi.cc:(.text+0x10): undefined reference to `gifti_disp_lib_version()' 

ヘッダーファイルに定義されているすべてのものがアクセス可能であることに注意してください(gifti_imageタイプdef)。しかし、リンカーが私の-lgiftiioフラグで文句を言っていなくても、オブジェクトファイルが見つかると、私は関数定義を取得しません。

答えて

1

get the following error

あなたのリンクのコマンドラインは間違っている、とする必要があります:

g++ -I/usr/include/gifti -I/usr/include/nifti read_hemi.cc -lgiftiio 

理由を理解するには、thisまたはthisをお読みください。

更新:

changing the order does not help

エラーメッセージから、私たちは、未解決のシンボルがC++のマングルされた一つであることを参照してください。

gifti_disp_lib_versionを検索すると、このバージョンはgifti_io.hです。これは純粋なCライブラリであり、ヘッダーには適切なC++ガードがありません。これを回避するには

、あなたがそうのようにプログラムを変更する必要があります。リンクについては

extern "C" { 
#include <gifti_io.h> 
} 

int main(const int argc, const char *argv[]) { 
    // rest as before ... 
+0

おかげで、私はそれらを理解だと思います。ただし、順序を変更しても効果はありません。あなたのコマンドをコピーして貼り付けると、まったく同じエラーになります。 –

+0

私は2つのコマンドを分割し、最初にコンパイルすることができます: 'g ++ -c -I/usr/include/gifti -I/usr/include/nifti read_hemi.cc' に続いて ' g ++ read_hemi .o -lgiftiio' これは同じエラーを返します –

+0

@CarsonMcNeil答えを更新しました。 –

関連する問題