libpngのUniversal Binaryを作成 - 途中

libpng-1.2.12のUniversal Binaryを作成する。
下記の3つの環境でlibpng-1.2.12をビルドしてみる。


下記のように3つの環境でlibpng-1.2.12をビルドする。

configure 
make
sudo make install

fileコマンドでlibpng12.aを確認

Mac OS X 10.3.9 , Power Mac G3でビルドしたlibpng12.a
Macintosh:13.Projects kuru$ file lib_ppc/libpng12.a
lib_ppc/libpng12.a: current ar archive random library
Mac OS X 10.5.8 , iMac (Intel)でビルドしたlibpng12.a
Macintosh:13.Projects kuru$ file lib_i386/libpng12.a
lib_i386/libpng12.a: current ar archive random library
Mac OS X 10.6.1 , MacBook Pro (Intel)ビルドしたlibpng12.a
Macintosh:13.Projects kuru$ file lib_x86_64/libpng12.a
lib_x86_64/libpng12.a: current ar archive random library

複数のライブラリを結合してUniversal Binaryにする

lipoコマンドで結合
Macintosh:13.Projects kuru$ lipo -create lib_x86_64/libpng12.a lib_ppc/libpng12.a lib_i386/libpng12.a -output lib/libpng12.a 
Macintosh:13.Projects kuru$ file lib/libpng12.a
fileコマンドで確認
lib/libpng12.a: Mach-O universal binary with 3 architectures
lib/libpng12.a (for architecture x86_64):	current ar archive random library
lib/libpng12.a (for architecture ppc):	current ar archive random library
lib/libpng12.a (for architecture i386):	current ar archive random library

ファイル自体はUniversal Binarynになっている。

テストプログラムを作成し実行してみる

png_sig_cmpを使った簡単なプログラムを作成し試してみる。

開発環境

ビルド

Universal Binaryになっているlibpng12.aをリンクしビルドしてみるが、
「ビルド設定のアクティブアーキテクチャのみをビルド」をOFFにするとリンクエラーが発生。

「ビルド設定のアクティブアーキテクチャのみをビルド」をOFFのビルド結果
プロジェクト LibPngTest の ビルド LibPngTest(構成 Debug)

Ld build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/x86_64/LibPngTest normal x86_64
cd /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest
setenv MACOSX_DEPLOYMENT_TARGET 10.3
/Developer/usr/bin/gcc-4.0 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib_intel -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib_ppc -F/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -filelist /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/x86_64/LibPngTest.LinkFileList -mmacosx-version-min=10.3 -lpng12 -o /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/x86_64/LibPngTest

CompileC build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/i386/main.o main.c normal i386 c com.apple.compilers.gcc.4_0
cd /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest
setenv LANG en_US.US-ASCII
/Developer/usr/bin/gcc-4.0 -x c -arch i386 -fmessage-length=0 -pipe -std=gnu99 -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -isysroot /Developer/SDKs/MacOSX10.6.sdk -mfix-and-continue -mmacosx-version-min=10.3 -gdwarf-2 -iquote /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-generated-files.hmap -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-own-target-headers.hmap -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-all-target-headers.hmap -iquote /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-project-headers.hmap -F/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug/include -I../library/libpng-1.2.12 -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/DerivedSources/i386 -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/DerivedSources -c /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/main.c -o /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/i386/main.o

CompileC build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/ppc/main.o main.c normal ppc c com.apple.compilers.gcc.4_0
cd /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest
setenv LANG en_US.US-ASCII
/Developer/usr/bin/gcc-4.0 -x c -arch ppc -fmessage-length=0 -pipe -std=gnu99 -Wno-trigraphs -fpascal-strings -O0 -Wreturn-type -Wunused-variable -isysroot /Developer/SDKs/MacOSX10.6.sdk -mfix-and-continue -mtune=G5 -mmacosx-version-min=10.3 -gdwarf-2 -iquote /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-generated-files.hmap -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-own-target-headers.hmap -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-all-target-headers.hmap -iquote /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/LibPngTest-project-headers.hmap -F/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug/include -I../library/libpng-1.2.12 -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/DerivedSources/ppc -I/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/DerivedSources -c /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/main.c -o /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/ppc/main.o

Ld build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/i386/LibPngTest normal i386
cd /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest
setenv MACOSX_DEPLOYMENT_TARGET 10.3
/Developer/usr/bin/gcc-4.0 -arch i386 -isysroot /Developer/SDKs/MacOSX10.6.sdk -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib_intel -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib_ppc -F/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -filelist /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/i386/LibPngTest.LinkFileList -mmacosx-version-min=10.3 -lpng12 -o /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/i386/LibPngTest

ld: warning: in /Developer/SDKs/MacOSX10.6.sdk/usr/local/lib/libpng12.dylib, file is not of required architecture
Undefined symbols:
  "_png_sig_cmp", referenced from:
      _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Ld build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/ppc/LibPngTest normal ppc
cd /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest
setenv MACOSX_DEPLOYMENT_TARGET 10.3
/Developer/usr/bin/gcc-4.0 -arch ppc -isysroot /Developer/SDKs/MacOSX10.6.sdk -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib_intel -L/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/../lib_ppc -F/Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug -filelist /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/ppc/LibPngTest.LinkFileList -mmacosx-version-min=10.3 -lpng12 -o /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/LibPngTest.build/Debug/LibPngTest.build/Objects-normal/ppc/LibPngTest

ld: warning: object file compiled with -mlong-branch which is no longer needed. To remove this warning, recompile without -mlong-branch: /Developer/usr/bin/../lib/gcc/powerpc-apple-darwin10/4.0.1/crt2.o
ld: warning: in /Developer/SDKs/MacOSX10.6.sdk/usr/local/lib/libpng12.dylib, file is not of required architecture
Undefined symbols:
  "_png_sig_cmp", referenced from:
      _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

これは、libpng12.dylibを消してしまえば大丈夫かも?


「ビルド設定のアクティブアーキテクチャのみをビルド」をONのビルド結果

「ビルド設定のアクティブアーキテクチャのみをビルド」をONにすると正常にビルドできた。

実行

ビルドしたテストプログラムを実行してみると正常に動作したが、
試しに/usr/local/libの下のlibpng関連のファイルを削除して実行すると下記のエラーになった。

dyld: Library not loaded: /usr/local/lib/libpng12.0.dylib
  Referenced from: /Users/kuru/Documents/00_Atotok/11.atotok-dev/13.Projects/LibPngTest/build/Debug/./LibPngTest
  Reason: image not found
Trace/BPT trap

このあとやること

  • dylibを要求しないようにビルドする
  • 「ビルド設定のアクティブアーキテクチャのみをビルド」をOFFでもビルドできるライブラリを作成する
  • CFLAGSなど設定しconfigureとmakeでUniversal Binaryを作成


こんな感じか?