2016-06-17 2 views
0

Linuxで書かれたOS Xでアプリケーションを構築しようとしていますが、ヘルパーファイルでエラーが多発しています。ヘルパーは、フォームのcmathのラッパーです:OS XでLinuxアプリケーションをコンパイルする - 標準ライブラリ(cmath)を見つけられない

#include <cmath> 

namespace [application name] 
{ 
    namespace math 
    { 
    template<typename T> 
    inline T Log10(const T& x) 
    { 
     return T(log10(static_cast<double>(x))); 
    } 
    } 
} 

そして私は、フォームの取得エラーです:私が言ったスタックオーバーフローでこの問題と誰かにいくつかの研究を行ってきた

/pathtofile/common/math/Helpers.t:132:16: error: use of undeclared identifier 'log10'; did you mean 'Log10'? 
    return T(log10(static_cast<double>(x))); 
     ^
/pathtofile/common/math/Helpers.t:130:14: note: 'Log10' declared here 
inline T Log10(const T& x) 

私はこの問題を抱えていました。それは私を狂ったものにしていましたが、原因を突き止めました。

この場合、一般的なcmathヘッダー(またはmath.h - エラーと解決策はC++またはCで発生します)には、アーキテクチャー固有の数学サブヘッダーを含むアーキテクチャー環境スイッチがあります。アーキテクチャスイッチ(環境変数)は定義されていませんでしたので、実際には数学関数を定義したヘッダを実際には含まないようにしていました。

本当に単一のmath.hまたはcmath.hが含まれていましたが、それは含まれていましたが、それは数学関数を得るには不十分でした。私の場合は、アーキテクチャ変数を定義するのではなく、代わりに正しい部分数のヘッダーの場所を見つけて、それらをコンパイルパスに追加しました。その後、プロジェクトは成功しました!

これは、LinuxプロジェクトをOS-Xに移植するときに多く発生する問題のようです。私は、プロジェクトがプラットフォーム間で移動され、標準ライブラリのヘッダが異なって配置されるようなときにいつでも発生するかもしれないと思います。

これが問題ですか?もしそうなら、どのように私はこれを解決するのですか(私は彼の助言に従う方法がわかりません)?

編集:私は名前空間stdで数学関数を参照する場合、私は次を得る:

/pathtofile/common/math/Helpers.t:62:14: error: no member named 'acos' in namespace 'std'; did you mean 'ACos'? 
    return std::acos(x); 
     ^~~~~ 
/pathtofile/common/math/Helpers.t:60:14: note: 'ACos' declared here 
inline T ACos(const T& x) 

EDIT2:それは、関連するなら、私はcmakeの3.0で、このプロジェクトをビルドしようとしています。コード自体は孤立して正常に動作するため、問題は他の場所にあるように見えます。

+1

標準ライブラリ関数は 'std'名前空間にあります。したがって 'std :: log10'を呼び出す必要があります。 –

+0

@CodyGrayそれは私の最初の考えでもありました。私はその変更の結果を反映するようにOPを編集しました。 – dcastello

+0

'の#include 名前空間数学 {テンプレート インラインTをLog10(CONST T&X) {\tリターンT(LOG10(static_castを(X)))。メイン }} //数学 INT(){ \tオートT =数学::をLog10(10)。 \t return 0; } 'これはOSX 10.11でコンパイルされているようですが、どのバージョンをコンパイルしていますか?コンパイルを指定しましたか?-std? – kirinthos

答えて

1
$ cat > chk.cpp 
#include <cmath> 

namespace app 
{ 
    namespace math 
    { 
     template<typename T> 
     inline T Log10(const T& x) 
     { 
      return T(log10(static_cast<double>(x))); 
     } 
    } 
} 

int main() 
{ 

    return app::math::Log10(100.0); 
} 
$ c++ -std=c++14 chk.cpp 
$ ./a.out 
$ echo $? 
2 

ここに問題はないと思います。

+0

あなたは正しいと思います。私は問題が何とかcmakeと考えている。 cmakeがこの問題をOS X用のLinuxアプリケーションを構築する方法を考えることができますか?私が助けてくれる投稿コードはありますか? – dcastello

+1

問題を再現する最小のcmakeファイルですか?私はここでcmakeを通過するのに十分小さい何か? –

+0

すなわち1つのソースファイル、1つのcmakeスクリプトファイル。すべての図書館などが剥奪された –

関連する問題