2011-12-10 35 views
2

我想在MacOSX上的Subsurface上做一個靜態二進制文件,這樣我們就可以提供一個簡單的二進制下載。我無能爲力解決我遇到的問題,但那可能只是因爲我吸吮了C.如何在MacOSX上編譯靜態二進制子地表?

這就是我所做的。我已經安裝的gconf和GTK2從MacPorts,而我沒有libusb的建設爲簡單起見:

git clone git://libdivecomputer.git.sourceforge.net/gitroot/libdivecomputer/libdivecomputer 
cd libdivecomputer 
autoreconf --install 
./configure 
make LDFLAGS="-static" 
sudo make install 
cd .. 
git clone git://subsurface.hohndel.org/subsurface.git 
cd subsurface 
make LDFLAGS="-framework CoreFoundation -static" 

結果是這樣的:

gcc -framework CoreFoundation -static -o subsurface main.o dive.o profile.o info.o equipment.o divelist.o parse-xml.o save-xml.o libdivecomputer.o print.o uemis.o gtk-gui.o statistics.o macos.o -L/opt/local/lib -lxml2 -lz -lpthread -liconv -lm -L/opt/local/lib -lxslt -lxml2 -lz -lpthread -liconv -lm -L/opt/local/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangocairo-1.0 -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lgio-2.0 -lXfixes -lcairo -lX11 -lpng14 -lpango-1.0 -lm -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl /usr/local/lib/libdivecomputer.a -lpthread 
/usr/bin/ld_classic: can't locate file for: -lcrt0.o 
collect2: ld returned 1 exit status 
make: *** [subsurface] Error 1 

現在,如果我的符號鏈接/ usr/lib目錄/信息crt0的.o到/usr/lib/crt1.o,我得到這個:

gcc -framework CoreFoundation -static -o subsurface main.o dive.o profile.o info.o equipment.o divelist.o parse-xml.o save-xml.o libdivecomputer.o print.o uemis.o gtk-gui.o statistics.o macos.o -L/opt/local/lib -lxml2 -lz -lpthread -liconv -lm -L/opt/local/lib -lxslt -lxml2 -lz -lpthread -liconv -lm -L/opt/local/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangocairo-1.0 -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lgio-2.0 -lXfixes -lcairo -lX11 -lpng14 -lpango-1.0 -lm -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl /usr/local/lib/libdivecomputer.a -lpthread 
ld: warning: ignoring file /usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/libgcc_static.a, file was built for archive which is not the architecture being linked (x86_64) 
ld: warning: unexpected dylib (/System/Library/Frameworks//CoreFoundation.framework/CoreFoundation) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libxml2.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libz.dylib) on link line 
ld: warning: unexpected dylib (/usr/lib/libpthread.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libiconv.dylib) on link line 
ld: warning: unexpected dylib (/usr/lib/libm.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libxslt.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libgtk-x11-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libgdk-x11-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libatk-1.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libpangocairo-1.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXext.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXrender.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXinerama.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXi.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXrandr.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXcursor.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXcomposite.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXdamage.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libgdk_pixbuf-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libpangoft2-1.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libgio-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libXfixes.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libcairo.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libX11.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libpng14.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libpango-1.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libfreetype.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libfontconfig.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libgobject-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libgmodule-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libgthread-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libglib-2.0.dylib) on link line 
ld: warning: unexpected dylib (/opt/local/lib/libintl.dylib) on link line 
Assertion failed: (_pointerLocations.size() == 0), function size, file /SourceCache/ld64/ld64-123.2.1/src/ld/LinkEditClassic.hpp, line 961. 
0 0x10226171c __assert_rtn + 76 
1 0x1023233f5 ld::tool::ExternalRelocationsAtom<x86_64>::size() const + 149 
2 0x1022d8a17 ld::tool::OutputFile::updateLINKEDITAddresses(ld::Internal&) + 583 
3 0x1022d1aae ld::tool::OutputFile::write(ld::Internal&) + 142 
4 0x102261caa main + 1178 
5 0x1022502b4 start + 52 
collect2: ld returned 1 exit status 
make: *** [subsurface] Error 1 

如果我建立libdivecomputer和地下有 「-arch i686的」 相反,我得到這樣的:

gcc -framework CoreFoundation -arch i686 -static -o subsurface main.o dive.o profile.o info.o equipment.o divelist.o parse-xml.o save-xml.o libdivecomputer.o print.o uemis.o gtk-gui.o statistics.o macos.o -L/opt/local/lib -lxml2 -lz -lpthread -liconv -lm -L/opt/local/lib -lxslt -lxml2 -lz -lpthread -liconv -lm -L/opt/local/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangocairo-1.0 -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lgio-2.0 -lXfixes -lcairo -lX11 -lpng14 -lpango-1.0 -lm -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl /usr/local/lib/libdivecomputer.a -lpthread 
/usr/bin/ld_classic: /usr/lib/crt0.o incompatible, file contains unsupported type of section 2 (__IMPORT,__pointers) in load command 0 (must specify "-dynamic" to be used) 
/usr/bin/ld_classic: incompatible flag -framework used (must specify "-dynamic" to be used) 
collect2: ld returned 1 exit status 
make: *** [subsurface] Error 1 

我在使用XCode 4.2.1的MacOSX Lion上。

回答

2

解決方案不是靜態構建這個東西,而是將庫包含在.app包中。無論是二進制和需要與install_name_tool要更新的庫使用相對路徑:

$ otool -L subsurface 
subsurface: 
    /opt/local/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.8.0) 
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.7) 
    ... 
$ install_name_tool -change /opt/local/lib/libxml2.2.dylib \ 
    @executable_path/../Resources/lib/libxml2.2.dylib subsurface 
$ otool -L subsurface 
subsurface: 
    @executable_path/../lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.8.0) 
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.7) 
    ... 

gtk-mac-bundler可用於自動執行此過程。在Subsurface macosx packaging directory的更多細節。

0

除非gtk庫有.la(libtool)元文件和.a(靜態)構建,否則我不知道這是否可以輕鬆完成 - 或者至少是自動完成。至少要添加:--disable-shared./configure

可以試一下:env LDFLAGS="-static-libtool-libs" ./configure --disable-shared,而不是在make的調用中設置它。

試圖將CoreFoundation,libgcc等鏈接爲靜態庫,即使它們存在也沒有意義,因爲它們始終存在。

+0

感謝您試圖弄清楚這一點!我添加了CoreFoundation,因爲我需要它在這臺機器上構建Subsurface。在我工作幾乎完全相同的機器上,無論出於何種原因,我都不需要它。我試着按照你說的方式配置libdivecomputer,但沒有幫助。地下沒有配置腳本。爲什麼它會查找不存在的/usr/lib/crt0.o?太多的問題在這裏:) – neu242

+0

我想知道如果你發現這個問題的原因?謝謝 – user454083

+0

@ user454083 Nah,但我找到了解決方案。看到接受的答案。 :) – neu242