3

私は、大規模な (~1M LOC) プロジェクトを Window/Visual Studio 環境から他のプラットフォームに移植する過程にあり、最初のプラットフォームはたまたま Mac OS X でした。

当初、プロジェクトは Visual Studio ソリューションおよびプロジェクトとして構成されていましたが、現在は (優れた) Premake ( http://industriousone.com/premake ) を使用して、複数のプラットフォーム (VS、XCode、GMake) 用のプロジェクト ファイルを生成しています。

最初のいくつかのプロジェクトを構成、移植、および構築しましたが、大きな問題はありませんでしたが、数学ライブラリを移植した後、解決できなかったこの奇妙なリンクエラーに遭遇しました: math.h から使用された関数はリンクに失敗します。 (未解決のシンボルの原因)。

参考までに、x86_64 アーキテクチャ用の gcc v4.2 を使用してビルドしている XCode v3.2.1 のプロジェクトを生成するために Premake v4.2.1 を使用しています。(これはすべて 64 ビットの Snow Leopard で) -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6 を追加して、「既知の」S​​DK に対してすべてをリンクおよびビルドするように gcc を説得しようとしました。ビルド コマンド ラインに。

通常の状況では、-lm を追加することでこれを処理できますが、Darwin では、これらの数学ライブラリは libSystem に含まれており、私が知る限り、gcc/ld によって暗黙的にリンクされます。

XCode内から実行するだけのダミープロジェクトを作成しようとしました:

float f = log2(2.0)+log2f(3.f)+log1p(1.1)+log1pf(1.2f)+sin(8.0);
std::cout << f << std::endl;

予想通り、これは問題なくビルドできます。しかし、Premake で生成されたプロジェクト内のコードに同じものを入れると、それらの数学関数はすべて未解決になってしまいます。

「ネイティブ」XCode プロジェクトからのリンク コマンドと、生成された XCode プロジェクトを比較すると、それらはかなり同じように見えます (生成されたプロジェクトが他のライブラリもリンクしていることを除いて)。

「ネイティブ」プロジェクト:

/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -isysroot /Developer/SDKs/MacOSX10.6.sdk -Lsomepath -Fsomepath -filelist somefile -install_name somename -mmacosx-version-min=10.6 -single_module -compatibility_version 1 -current_version 1 -o somename

生成されたプロジェクト:

/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -Lsomepath -Fsomepath -filelist somefile -install_name somename -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6 somelib.a somelib2.a somelib.dylib somelib2.dylib -single_module -compatibility_version 1 -current_version 1 -o somename

続行する方法についてのヘルプやヒントをいただければ幸いです。これを解決するのに役立つ gcc フラグやその他のツールはありますか?

4

1 に答える 1

0

私はついにこれを解決/回避することができました。

交換することにより

#include <math.h>
float f = sinf(1.f);

#include <cmath>
float f = std::sin(1.f);

すべてが期待どおりにリンクします。

cmathソリューションは、おそらく最初に作成する必要のあるコードであるという事実を受け入れますが、Cアプローチがそれほど悲惨に失敗した理由についてのさらなる意見を喜んで受け入れます。

于 2010-03-11T20:49:55.700 に答える