创建包含 ncurses 的静态库

Create static library including ncurses

我想创建一个使用 ncurses 实现 TUI 界面的静态库。我是这个主题的新手,应用这些答案没有用 为我出去。

我想 link varViewer.c 去图书馆。我用这段代码编译了一个示例文件。

正在编译 src/example.c 和 src/viewer/varViewer.c:

    gcc -Wall -Wextra -Wnonnull  -Isrc/viewer/
     -c src/example.c -o obs/example.o -lncurses
     -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2
    gcc -Wall -Wextra -Wnonnull  -Isrc/viewer/ 
     -c src/viewer/varViewer.c -o obs/viewer/varViewer.o -lncurses
     -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2

链接 obs/example.o 到 bin/example:

    gcc -o bin/example -Isrc/viewer/
     obs/example.o obs/viewer/varViewer.o -lncurses
     -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2

bin/example 按预期工作。我试图编译一个合适的目标文件:

编译src/viewer/varViewer.c:

    gcc -Wall -Wextra -Wnonnull  -Isrc/viewer/
    -c src/viewer/varViewer.c -o lib/objects/varViewer.o
    -lncurses -fPIC -O2

并入库:

    ar -cvr lib/libvarViewer.a lib/objects/varViewer.o

当我尝试在其他项目中使用它时,使用

包含它

-L ..../src/viewer/lib -lvarViewer

flags 但所有对我在 ncurses 库中使用的函数的引用以及 string.h 未定义:

nm /lib/libvarViewer.a

                .... 
             U __snprintf_chk
             U __stack_chk_fail
             U start_color
             U stdscr
             U strchr
             U strlen
             U strncmp
             U strncpy
             U strnlen
             U waddnstr
             U wborder
             U wclear
             U wcolor_set
             U wgetnstr
             U winsdelln
             U winsnstr
             U wmove
             U wrefresh

ar的正确调用方式是什么?我已经尝试使用 -T 选项生成 "thin" 库。

命令

gcc -Wall -Wextra -Wnonnull  -Isrc/viewer/
-c src/viewer/varViewer.c -o lib/objects/varViewer.o
-lncurses -fPIC -O2

将简单地编译 varViewer.c 文件,因此将忽略库,因为它不会 link 成为最终的可执行文件。

因此,目标文件 varViewer.o 将有未定义的引用(Unm 中报告,如您所示)对 varViewer.c 中未定义的符号。这些不仅包括 libncurses 库,还包括常规的 libc 库(它提供 strlenstrncpy、...等符号)。但是,请记住 libc 将由编译器自动添加到您的 link 阶段,除非您明确说明。

可以使用命令ar x从其他静态库中提取目标文件(.o),然后再次使用ar生成一个新图书馆。虽然这是可能的,但我认为将所有库都包含到您的库中并不是一个好主意。我认为最好 link 针对所有需要的库,因为这样可以确保应用程序 link 针对可用的最新版本进行编辑——而如果您将一个库嵌入到您的库中,则将坚持该版本,直到您升级它。