簡體   English   中英

靜態鏈接ncurses到程序

[英]Statically link ncurses to program

我有一些問題靜態地將ncurses鏈接到我的一個程序

這是一個非常簡單的示例程序:

#include<ncurses.h>


int main(){

    initscr();
    printw("Hello world\n");
    refresh();
    getch();
    endwin();
    return 0;
}

當我用它編譯它

gcc -static -lncurses hello_curses.c -o curses

我收到這些錯誤:

/tmp/ccwHJ6o1.o: In function `main':
curses_hello.c:(.text+0x5): undefined reference to `initscr'
curses_hello.c:(.text+0x14): undefined reference to `printw'
curses_hello.c:(.text+0x1b): undefined reference to `stdscr'
curses_hello.c:(.text+0x20): undefined reference to `wrefresh'
curses_hello.c:(.text+0x27): undefined reference to `stdscr'
curses_hello.c:(.text+0x2c): undefined reference to `wgetch'
curses_hello.c:(.text+0x31): undefined reference to `endwin'
collect2: ld returned 1 exit status

我有點困惑為什么這不起作用。 我在這里錯過了什么?

您需要在命令行的末尾傳遞-l選項:

gcc -static hello_curses.c -o curses -lncurses

當編譯器遇到-lfoo ,它會鏈接foo中前一個文件請求的所有符號。 如果您在開頭放置-lfoo ,則尚未請求任何符號,因此沒有符號鏈接。

編輯:

我認為真正的問題是你需要在命令的末尾指定你的-l選項。 我只是按照你的方式嘗試它並重現你的錯誤。 如果我在行尾添加-l:libncurses.a ,那么它可以正常工作。 所有沒有-static選項BTW。


我認為正在發生的事情是你有一個動態的ncurses庫,但是你使用了-static選項,這意味着不使用任何動態庫。 我懷疑你實際上沒有靜態版本的ncurses庫,即一個以.a后綴結尾的版本。

如果要鏈接ncurses的靜態版本(.a)而不是動態版本(.so),則暫時刪除libncurses.so的符號鏈接,以便鏈接器選擇.a文件。 或者將.a文件復制到其他位置並將其添加到較早的搜索路徑中。

或者,如果您的鏈接器支持它(例如ld ),那么您可以指定-l:libncurses.a而不是-lncurses

我只是在ARM處理器上花了幾個小時,試圖讓它工作,因為接受的答案對我不起作用。

以下是我的發現:

顯然地

gcc -static hello_curses.c -o curses -lncurses

適用於x64處理器,但不適用於ARM處理器。

當我嘗試使用上面的行時,我仍然得到OP的所有“未定義的引用錯誤”(以及更多)。

您還需要鏈接libtinfo.a,並注意序列很重要。
這是正確的命令行:

gcc -static hello_curses.c -o curses -lncurses -ltinfo

如果你混淆了序列,那么它將不起作用......

gcc -static hello_curses.c -o curses -ltinfo -lncurses 

對'unctrl'的未定義引用

當然,如果您使用:lib語法,這也有效

這編譯

gcc -static hello_curses.c -o curses -l:libncursesw.a -l:libtinfo.a

這不編譯

gcc -static hello_curses.c -o curses -l:libtinfo.a -l:libncursesw.a 

哦,我喜歡gcc ...
絕不允許這個計划從幼兒園畢業

(.text + 0x2a8):對cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair':(。text + 0x2ac):對cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair':(。text + 0x50a):對tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_pair':(。text + 0x518):對_nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用_nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color':(。text + 0x552):對cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color':(。text + 0x556):未定義的引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color':(。te xt + 0x5e4):對tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用tparm' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function init_color':(。text + 0x5f2):對_nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用_nc_putp' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function can_change_color':(。text + 0x740):對cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function can_change_color':(。text + 0x744):對cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors':(。text + 0x768):未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function has_colors':(。text + 0x76c):未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o): In function color_中 content':(。text + 0x7c2):對cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):(.text+0x7c6): more undefined references to未定義引用cur_term' /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):(.text+0x7c6): more undefined references to cur_term'跟隨/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw。 a(lib_color.o):函數_nc_do_color': (.text+0x8de): undefined reference to tparm的_nc_do_color': (.text+0x8de): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm- linux-gnueabihf / libncursesw.a(lib_color.o):函數_nc_do_color': (.text+0x8e6): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8/../ .. /../arm-linux-gnueabihf/libncursesw.a(lib_color.o):函數_nc_do_color': (.text+0x958): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8 /../../../arm-linux-gnueabihf/libncursesw.a(lib_color.o):在函數set_foreground_color': (.text+0x62): undefined reference to '/ usr / lib / gcc / arm -linux-gnueabihf / 4.8 /../../../ arm-linux-gnueabihf / libncursesw.a(lib_color.o):在函數set_background_color': (.text+0xa2): undefined reference to set_background_color': (.text+0xa2): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_hline .o):在函數whline': (.text+0xec): undefined reference to acs_map的whline': (.text+0xec): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf /libncursesw.a(lib_hline.o):在函數whline': (.text+0xf0): undefined reference to acs_map的whline': (.text+0xf0): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../ .. /arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o):在函數wadd_wch': (.text+0x4fe): undefined reference to TABSIZE的wadd_wch': (.text+0x4fe): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8/ .. /../../arm-linux-gnueabihf/libncursesw.a(lib_add_wch.o):在函數wadd_wch': (.text+0x502): undefined reference to TABSIZE'/ usr / lib / gcc / arm-linux- gnueabihf / 4.8 /../../../ arm-linux-gnueabihf / libncursesw.a(lib_add_wch.o):在函數wecho_wchar': (.text+0x6d8): undefined reference to TABSIZE'/ usr / lib / gcc / arm-linux-gnueabihf / 4.8 /../../../ arm-linux-gnueabihf / libncursesw.a(lib_add_wch.o):在函數wecho_wchar': (.text+0x6dc): undefined reference to wecho_wchar': (.text+0x6dc): undefined reference to TABSIZE的wecho_wchar': (.text+0x6dc): undefined reference to '/usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../arm-linux-gnueabihf/libncursesw.a(lib_wunctrl.o) :在函數wunctrl': (.text+0x30): undefined reference to unctrl的wunctrl': (.text+0x30): undefined reference to 'collect2:error:ld返回1退出狀態

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM