2013-06-11 79 views
2

所以也許這是我暴露我的天真在鏈接和編譯方面。靜態鏈接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),但它只是分段錯誤(由[此篇]所建議的)。

+1

由於授權問題,「glibc」的靜態連接可能不可行 - 他們要確保你的程序的任何用戶都有能力使用他們自己選擇的另一個庫。 –

+0

是的 - 我開始認爲情況可能如此。困難的是,這實際上不是我的代碼,所以我現在正在重寫Makefile以查看是否存在忽略標誌的問題。 – Alex

+1

什麼操作系統? –

回答

2

這是一個常見問題。從2011年起,所有後來的發行版都沒有靜態版本的64位庫。它們隨附32位版本,但不包含64.您只需使用libm,libc等共享lib版本。

+0

-1我目前最新的OpenSuSE(使用該版本)包含這一點。 –

+0

@VladimirF你從哪裏得到它的?我可以從網上找到關於如何獲得靜態庫的信息。 – Alex

+0

從包管理器中,打包'glibc-devel-static'。 http://software.opensuse.org/package/glibc-devel-static –