在基於CentOS 6.4的chroot中,我正在工作,鏈接ncurses與ld 2.20成功,但鏈接ld 2.24失敗。我不直接調用鏈接器,gcc正在處理它 - gcc 4.4.7使用ld 2.20,而gcc 4.8.2使用ld 2.24。鏈接失敗與gcc 4.8.2/ld 2.24,成功與gcc 4.4.7/ld 2.20
這是一個最小的例子,它無法在我的特定環境中與gcc 4.8.2/ld 2.24鏈接。
#include <ncurses.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
WINDOW* window = NULL;
if (!(window = initscr())) {
printf("Error initializing ncurses.");
exit(1);
}
halfdelay(50);
getch();
endwin();
}
成功(LD 2.20):
$ gcc main.c -lncurses -Wl,--verbose | grep "ncurses.*succeeded" attempt to open /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libncurses.so succeeded $
故障(LD 2.24):
$ /opt/gcc/4.8.2/bin/gcc48 main.c -lncurses -Wl,--verbose | grep "ncurses.*succeeded" attempt to open /usr/lib/../lib64/libncurses.so succeeded /opt/binutils/2.24/bin/ld24: /tmp/ccCxUFxl.o: undefined reference to symbol 'halfdelay' /lib64/libtinfo.so.5: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status $
注意,這兩個命令似乎對鏈接相同的libncurses.so。
對於它的價值,在基於CentOS 5.4的不同chroot中,有一個不同的libncurses版本,它與ld 2.24很好地鏈接,但不幸的是,在chroot中構建不是一個選項。 nm實用程序顯示(靜態)libncurses.a在這裏確實具有所需的符號(nm列表中沒有libncurses.so的符號 - 所以我只是假設它們是相似的)。
但是,在CentOS 6.4 chroot中,nm顯示我得到的「未定義引用」消息的所有ncurses符號確實未定義,或者在Centos 6.4 chroot的libncurses.a中不存在,因爲與gcc 4.4.7連接起作用。有些事情是不對的。
另外,我試着用gcc 4.4.7生成一個對象,然後用gcc 4.8.2鏈接,但是沒有幫助。
我很困惑,爲什麼一個編譯器/鏈接器會成功,而另一個會失敗。這是ABI問題嗎?有人知道這裏發生了什麼嗎?有沒有任何標誌可以傳遞給gcc來使新的鏈接器工作?
@FaroukJouti,這將是錯誤的,所以沒有理由嘗試它!圖書館追蹤需要它們的文件。 – 2014-10-08 23:03:37
我試過完全一樣的東西,你嘗試過,它在gcc中工作得很好4.8.2 – 2014-10-08 23:16:53