32

この質問には答えがなく、学期の大部分をそれを理解するのに費やしたので、FreeTDS 0.91 を iPhone ARMv6、ARMv7 アーキテクチャにクロスコンパイルする方法を投稿しようと思いました。これは、Xcode 4.2 と iOS 5 SDK を使用して行われました。

この質問が尋ねられる理由は、Mircosoft SQL Sever に接続する必要がある iOS デバイス用のアプリを開発しているためです。Microsoft 独自の Tabular Data Stream (TDS) プロトコルを使用する必要があります。

また、これを試みるには、ある程度の技術的スキルが必要であることにも言及します。これは、私が理解するのに 2 か月近くかかった内容を非常に要約したものです (すべきでないことはすべて残しました)。

これに関連するその他のドキュメント:

FreeTDS の基本的な使い方http://www.freetds.org/userguide/samplecode.htm

Microsoft の TDS API ドキュメント http://msdn.microsoft.com/en-us/library/aa936985(v=sql.80)

以下の私の答えを見てください。

Xcode 4.5 の更新されたファイルについては、saskathex の回答も参照してください。

4

2 に答える 2

4

これらの標準構成フラグのドキュメントを見つけるのに何時間も費やす私のような人のために(./configure make make installを実行するため)

        ./configure --build is used for specifing the architecture you want to complie for
        ./configure --host is used to specify the ark of the machine doing the compileing (running xcode)
        ./configure --target seems to be an alias

それでは、問題を解決します。

1)FreeTDSの最新バージョンを入手する http://www.freetds.org/

2)次のステップは、FreeTDS./configureを正しく実行する独自のbashシェルファイルを作成することです。シミュレータはi386/i686アーキテクチャであり、Appleデバイス(iPhone、iPodなど)はARMアーキテクチャであるため、2つ必要になります。また、iPhone開発ディレクトリ内のコンパイラファイル/バージョンは異なる場合があります。論理的に意味があり、同様の命名規則があるものを見つけてください。macホストアーキテクチャには、コマンドuname-pが付属しています。

シミュレーター(i386)build_for_simulator_i386.shで使用するためのビルドの例を次に示します。

 #!/bin/sh

 #unset some shell variables
 unset CC
 unset CFLAGS
 unset CPP

 export buildPath=`pwd`

 # make i386 (Simulator) target
 export CC=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin11-llvm-gcc-4.2

 export CFLAGS="-isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk"

 # if you want Windows Authentication (NTLM) support you must use at least tds version 7
 # the default is 5
 ./configure --build=i386 --host=i386 --target=i386 --with-tdsver=7.1 

ARMコンパイル(build_for_device_armv7.sh)の構成例:

 #!/bin/sh

 # unset some shell variables
 unset CC
 unset CFLAGS
 unset CPP

 export buildPath=`pwd`

 # make arm target
 export CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2

 export CFLAGS="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk"

 export CPP=/usr/bin/cpp


 ./configure --build=arm-apple-darwin10 --host=x86_64-apple-darwin11.3.0 --target=armv7 --with-tdsver=7.1

3)freetdsダウンロードを解凍した結果のルートfreetdsディレクトリへの次のCD、私のものはfreetds_0.91でした

4)スクリプトの1つを実行します。一度にコンパイルできるのは1つのアーキテクチャのみです

 sh build_for_(desiered build)  
        this runs ./configure for you with the correct options
        (tds version 7 required for NTLM authentication)

5)構成プロセスが完了したら、構成ファイルをハックする必要があります。freetds_0.91 / include / config.hを開き、172行目で#defineHAVE_ICONV1#defineHAVE_ICONV0に変更します。

6)以前に./configure、make、make installを実行したことがある場合は、これらのコマンドを実行します。特に、これを行わずにmakeを実行するとエラーが発生するため、スイッチングアーキテクチャが

    sudo make clean
    sudo make uninstall

7)makeを使用してコンパイルを実行します

    make all
    sudo make install

makeプロシージャは意図的にエラーを処理しますが、シェルプロンプトの6行または7行以内にエラーが表示された場合は、戻ったら問題が発生するため、続行する前に修正する必要があります。この時点で多くのことがうまくいかない可能性があるとだけ言っておきましょう。

8) freetdsが作成するすべての小さな.oファイルの集大成であるバイナリコンパイル済みファイルをインストールした後は、/ usr / local / lib/libsybdb.aです 。ライブラリだけの.oファイルをプルしたくないと信じてください。あなたが欲しい。/usr/local/lib/libsybdb.aをプロジェクトの適切なフォルダーにコピーします。私が行ったのは、「compiled_freetds-0.91_simulator_i386」と「compiled_freetds-0.91_device_armv7」という名前の、アーキテクチャごとに1つずつ、2つの別々のフォルダを作成することでした。

9)生活を楽にし、使用するコンパイル済みファイルをxcodeに認識させたいので、この手順のサブセットに従って動的リンクを実行します。

 a) Select you project settings on the left had side of xcode 
 (the blue think with the name of your project on it)

 b) Select the Target (usual the same name as your app) 

 c) Navigate to **build settings**, scroll down to **linking > other linker flags**

 d) On the left side of Other Linker Flags a mouse over will reveal an expander,    
 expanding will reveal Debug and Release rows.

 e) Add the appriate architectures by selecting the plus on the right side of 
 either Debug or Release.  When the new row appears select the architecture, 
 double click the first editable field from the right to open  an entry box 
 that you can then drag the appropriate  complied file into it to be dynamically     
 linked.  You must do this for both files and when done correctly the file 
 under ARMv7 will be used when building for the device and the one for Any iOS   
 Simulator SDK will be used when running on the simulator.
 **Note:** You may also need to add the -all_load flag to resolve linking issues.

10)デバイスでコードを実行するときにlibsybdb.5.dylibに関連するダイナミックリンクエラーの問題を回避するように見える最後のステップは、アンインストールを行うことです。また、デバイスで実行すると、CPU_SUBTYPE_ARM_ALLが非推奨になることについて、36刻みで多くの警告が表示されます。これは正常ですが、煩わしいことです。

    sudo make uninstall  

これがお役に立てば幸いです。

于 2012-11-16T02:47:50.933 に答える
3

上記の bash ファイルを使用しましたが、XCode 4.5 以降、開発者ツールはアプリ バンドル内にあります。そこで、MacOS Lion と現在の XCode バージョン「4.5.2 (4G2008a)」で実行するようにスクリプトを変更しました。

build_for_simulator_i386.sh:

#!/bin/sh

# unset some shell variables
unset CC
unset CFLAGS
unset CPP

# make i386 (Simulator) target
export CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin11-llvm-gcc-4.2
export CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk"
export CPP=/usr/bin/cpp

./configure -build=i686-apple-darwin11 --host=i686-apple-darwin11 --target=i686-apple-darwin11 --with-tdsver=7.1

build_for_device_armv7.sh:

#!/bin/sh

# unset some shell variables
unset CC
unset CFLAGS
unset CPP

# make arm target
export CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
export CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk"
export CPP=/usr/bin/cpp

./configure --build=arm-apple-darwin10 --host=x86_64-apple-darwin11 --target=armv7 --with-tdsver=7.1

優れたアドオンは、lipinfo を使用して 2 つの静的ライブラリを 1 つにマージすることです。

lipo compiled_freetds-0.91_device_armv7/libsybdb.a compiled_freetds-0.91_simulator_i386/libsybdb.a -create -output universal_libsybdb.a

これをプロジェクトの設定に追加するだけです。

上記のスクリプトで多くの時間を節約できたので、共有したいと思いました。

于 2013-01-19T19:23:10.517 に答える