2010-04-27 66 views
23

我已經包括了頭netdb.h中,其中包含的getaddrinfo,但GCC的問題這樣的警告:創建使用getaddrinfo的靜態鏈接二進制文件?

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 

gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c 

我怎樣才能靜態編譯缺少什麼文件?

可能的解決方案:

  1. 這可能是glibc的安裝缺少必要的靜態編譯相應的目標文件。如果是這種情況,請創建相應的目標文件並在編譯時進行鏈接。

  2. 嘗試EGLIBC而不是glibc。

  3. 我用dietlibc成功編譯了我的程序,該程序編譯時沒有任何錯誤,加上生成的二進制文件比glibc製作的小得多。

+2

我會讓你的可能解決方案的答案。然後你可以接受你自己的答案。 – Lucas 2010-05-18 07:53:55

回答

12

glibc使用libnss來支持許多不同的地址解析服務提供者。不幸的是,你不能靜態鏈接libn​​ss,因爲它加載的提供程序取決於本地系統的配置。

+4

同時在版本2.20中有'configure'的'--enable-static-nss'標誌,它似乎做到這一點。請注意,靜態鏈接引入了一些缺點(請參閱@ pixelbeat的回答以及對它的評論)。 – 2014-09-20 18:18:32

+0

我發現了一個使用musl而不是glibc的解決方案。看到我的答案如下:http://stackoverflow.com/a/372​​45653/425758 – zhanxw 2016-05-16 19:18:20

1

我認爲某些功能依賴於動態加載程序在運行時處理事情。不幸的是,靜態鏈接不再實用http://people.redhat.com/drepper/no_static_linking.html

+0

我認爲這取決於你需要做什麼。如果二進制可移植性是必須的,靜態編譯是一個有效的解決方案。 – 2010-05-07 08:49:16

+0

上面提到的是,如果你靜態鏈接,有些東西是不可能的。我在這裏有一些關於二進制兼容性的註釋:http://www.pixelbeat.org/programming/linux_binary_compatibility.html – pixelbeat 2010-05-07 13:08:05

3

我找到了一個解決方案: 你可以用musl庫來代替glibc。 要使用musl,您可以使用musl-gcc, 進行安裝並構建軟件,也可以使用使用musl的Linux發行版,例如,高山Linux。因爲我不想構建多個編譯器(gcc,g ++和gfortran),所以爲了節省時間,我選擇了Alpine Linux來構建我的程序(https://github.com/zhanxw/rvtests)。

+0

你知道C++的解決方案嗎? – JC1 2017-10-12 23:38:33

+1

您可以使用Alpine Linux編譯C++代碼。 – zhanxw 2017-10-13 14:11:01

+0

謝謝。你知道在阿爾派編譯的二進制文件是否可移植?我正在構建一個在Amazon AWS上以lambda身份運行的二進制文件,我認爲強烈建議在CentOS上編譯它(用於lambdas的操作系統)。 – JC1 2017-10-13 16:46:00

相關問題