所以也許這是我暴露我的天真在鏈接和編譯方面。靜態鏈接64位glibc庫到二進制
我想編譯一些Fortran代碼,使它可以作爲獨立的二進制文件運行。一個問題(其中一個問題)是我想在一個使用GLIBC 2.14的系統上進行編譯,但在2.11上運行。是否有可能在像GLIBC這樣的庫中進行靜態鏈接,或者由於庫的大小而不可能這樣做?
我Makefile
使用-static
,-static-libgcc
和-static-libgfortran
標誌和下面的編譯器標誌
-c -cpp -fall-intrinsics -ffpe-trap=invalid,zero -std=f2003
然而,當我使用LDD的輸出,我得到
linux-vdso.so.1 => (0x00007fff13b63000)
libgfortran.so.3 => /usr/lib64/libgfortran.so.3 (0x00007febfd7cf000)
libm.so.6 => /lib64/libm.so.6 (0x00007febfd578000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007febfd362000)
libquadmath.so.0 => /usr/lib64/libquadmath.so.0 (0x00007febfd12c000)
libc.so.6 => /lib64/libc.so.6 (0x00007febfcd9c000)
/lib64/ld-linux-x86-64.so.2 (0x00007febfdae7000)
更新
我正在編譯的機器是runnin摹的openSUSE 12.2:
Linux 3.4.33-2.24-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
雖然我試圖執行對機器的openSUSE 11.4:
Linux 2.6.37.6-24-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
更新2
我已經重新編寫makefile文件,並且我試圖用ifort(intel編譯器)進行編譯,因爲它提供了可以減少一些依賴關係的static-intel標誌。
我LDD輸出現在
linux-vdso.so.1 => (0x00007fff381ff000)
libm.so.6 => /lib64/libm.so.6 (0x00007f89b07cf000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f89b05b2000)
libc.so.6 => /lib64/libc.so.6 (0x00007f89b0222000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f89b001e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f89b0a26000)
使用下面的編譯器標誌
FCFLAGS = -cpp -static-intel -static-libgcc
的問題是,如果我這樣做只是-static
(或-static-intel -static
)然後我得到
ld: cannot find -lm
ld: cannot find -lpthread
ld: cannot find -lc
ld: cannot find -ldl
ld: cannot find -lc
make: *** [IDP] Error 1
我相信這是因爲我沒有這些lib的靜態版本在我的系統
UPDATE 3
上raries我還試圖在庫中提供共享對象的方法(https://stackoverflow.com/a/3214232/615257),但它只是分段錯誤(由[此篇]所建議的)。
由於授權問題,「glibc」的靜態連接可能不可行 - 他們要確保你的程序的任何用戶都有能力使用他們自己選擇的另一個庫。 –
是的 - 我開始認爲情況可能如此。困難的是,這實際上不是我的代碼,所以我現在正在重寫Makefile以查看是否存在忽略標誌的問題。 – Alex
什麼操作系統? –