我想创建一个使用ncurses实现TUI接口的静态库。我是这个话题的新手,应用这些答案并不奏效为我而战。
- rpath
- 组合多个库
我想在库中链接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
奥林匹克广播服务公司/链接的例子。O to 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/观众/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/观众/lib -lvarViewer
标志,但所有引用的函数都来自于ncurses库和
纳米/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选项生成一个"瘦"库。
gcc -Wall -Wextra -Wnonnull -Isrc/viewer/
-c src/viewer/varViewer.c -o lib/objects/varViewer.o
-lncurses -fPIC -O2
将简单地编译varViewer.c文件,因此将忽略库,因为它不会链接到最终的可执行文件。
因此,对象文件varViewer。0将对varViewer.c中未定义的符号有未定义的引用(U
报告在nm
中,如您所示)。这些不仅包括libcurses库,还包括常规的libc库(它提供诸如strlen
, strncpy
,…等符号)。但是,请记住,libc
将被编译器自动添加到您的链接阶段,除非您明确地另有说明。
您可以使用命令ar x
从其他静态库中提取对象文件(.o),然后再次使用ar
生成新的库。虽然这是可能的,但我不认为将所有的库都包含到您的库中是一个好主意。我认为最好链接所有需要的库,因为这样可以确保应用程序链接到可用的最新版本,而如果您将一个库嵌入到您的应用程序中,那么将坚持该版本,直到您升级它。