2016-07-20 5 views
1

のアーキテクチャx86_64で見つかりません:sshtアーキテクチャの衝突?記号(S)私はCライブラリをインストールしようとしているMAC

私はメイクファイルを設定していると、それは間違いなく依存関係を見つけることです。私はそれがGCCを使用して作成すると、しかし、私はいくつかの警告が出ます:

In file included from ../ssht/src/c/ssht_core.c:23:0: 
../ssht/src/c/ssht_core.c: At top level: 
../ssht/src/c/ssht_sampling.h:39:20: warning: inline function ‘ssht_sampling_ind2elm’ declared but never defined 
extern inline void ssht_sampling_ind2elm(int *el, int *m, int ind); 

そして私はコードのテストを行うとき、私はエラーを取得する:

"_ssht_sampling_elm2ind", referenced from: 
    _ssht_test_gen_flm_complex.constprop.1 in ssht_test.o 
    _ssht_test_gen_flm_real in ssht_test.o 
    _ssht_test_gen_lb_flm_real in ssht_test.o 
    _ssht_test_gen_flm_complex in ssht_test.o 
    _ssht_test_gen_lb_flm_complex in ssht_test.o 
    _main in ssht_test.o 
    _ssht_core_mwdirect_inverse in libssht.a(ssht_core.o) 
    ... 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make: *** [../ssht/bin/c/ssht_test] Error 1 

私がされていないました私が理解できる解決策を見つけることができます。私は物事を変えかどうかを確認するために-m32と32ビットのインストールとしてインストールしようとした

Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-apple-darwin14.4.0/5.1.0/lto-wrapper 
Target: x86_64-apple-darwin14.4.0 
Configured with: ../gcc-5.1.0/configure --enable-languages=c++,fortran 
Thread model: posix 
gcc version 5.1.0 (GCC) 

が、私はi386の代わりにx86_64版と同じエラーが表示されます。ちなみに私のgccのバージョンがあります。

私はLinuxマシンにインストールしました。これは、依存関係の1つを除いて同一のmakefileでアクセスすることもできます。

助けてください!

+0

'ssht_sampling_ind2elm'はどのように見えますか? – ead

+1

@eadこの関数は次のようになります:inline void ssht_sampling_elm2ind(int * ind、int el、int m){ * ind = el * el + el + m; } –

+0

GNU89でビルドするべきかもしれません(おそらくC99をビルドしていると思います)。 http://stackoverflow.com/questions/216510/extern-inline/216546#216546 – ead

答えて

1

コードが壊れているように見えます。あなたが提示した警告は実際には良い手がかりです。標準は、指定:

For a function with external linkage, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern , then the definition in that translation unit is an inline definition. An inline definition does not provide an external definition for the function [...].

[C2011を、6.7.4/7]

警告が引用され、制限の違反信号

:警告に示されているヘッダファイルが与えられた関数の宣言を含む、inlineを負いますおよびextern指定子。 inline指定子のために、Cはその宣言が現れるすべての翻訳単位も定義を提供することを要求します。ヘッダーファイルに表示されるため、そのヘッダーを含むすべてのソースファイルに適用されます。ファイルssht_core.cにはヘッダーが含まれていますが、定義はありません。

ソースの調査によれば、指定された機能はファイル../ssht/src/c/ssht_sampling.cにのみ定義されていますが、ファイルには対応するヘッダは含まれていません。 Cソースファイルに対応するヘッダーがある場合、そのヘッダーを含めることは慣習的で便利です。これは、宣言間の不一致を捕捉するのに役立ちます。しかし、省略すること自体が間違っていないようにする必要はありません。この場合

は、しかしながら、ssht_sampling.cssht_sampling_ind2elm()の唯一の宣言は、その定義であり、それはexternなしinline指定子を負います。したがって、標準の上記セクションの第2部が適用される:そのファイルに対応する翻訳ユニットは、機能の外部定義を提供しない。つまり、それが提供する定義は、同じ翻訳単位内からしか見ることができず、ssht_core.cに関連するものなど、他のものからは見ることができません。

1つのファイルに他のファイルにインライン化することができますが、これは許可されていないか、実際には意味をなさない機能定義を提供するように見えます。私は図書館の著者とバグ報告をします。 1つの解決策は、ssht_sampling.cに独自のヘッダーを含めることです。それは警告を解決しませんが、リンケージの問題を修正する必要があります。 によって警告をクリアして、ヘッダー内の関数宣言からinline指定子を削除することもできます。あるいは、どのファイルがどのファイルに含まれているかを変更せずに、ヘッダとメインソースの両方の関数からinline指定子を削除することもできます。

+0

詳細な対応をありがとうございます。これにより、警告とエラーが修正されます。著者とバグ報告をします。 –

+0

'inline'を削除するのは、間違った修正です。なぜなら、それは簡単な関数だからです(OPはコメント内の定義をコピーしました)。代わりに、関数のすべてのユーザーがプロトタイプだけでなく定義を見ることができるヘッダーに定義を移動します。 –

関連する問題