创建包含 ncurses 的静态库
Create static library including ncurses
我想创建一个使用 ncurses 实现 TUI 界面的静态库。我是这个主题的新手,应用这些答案没有用
为我出去。
- rpath
- combine multiple libraries
我想 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 将有未定义的引用(U
在 nm
中报告,如您所示)对 varViewer.c 中未定义的符号。这些不仅包括 libncurses 库,还包括常规的 libc 库(它提供 strlen
、strncpy
、...等符号)。但是,请记住 libc
将由编译器自动添加到您的 link 阶段,除非您明确说明。
您可以使用命令ar x
从其他静态库中提取目标文件(.o),然后再次使用ar
生成一个新图书馆。虽然这是可能的,但我认为将所有库都包含到您的库中并不是一个好主意。我认为最好 link 针对所有需要的库,因为这样可以确保应用程序 link 针对可用的最新版本进行编辑——而如果您将一个库嵌入到您的库中,则将坚持该版本,直到您升级它。
我想创建一个使用 ncurses 实现 TUI 界面的静态库。我是这个主题的新手,应用这些答案没有用 为我出去。
- rpath
- combine multiple libraries
我想 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 将有未定义的引用(U
在 nm
中报告,如您所示)对 varViewer.c 中未定义的符号。这些不仅包括 libncurses 库,还包括常规的 libc 库(它提供 strlen
、strncpy
、...等符号)。但是,请记住 libc
将由编译器自动添加到您的 link 阶段,除非您明确说明。
您可以使用命令ar x
从其他静态库中提取目标文件(.o),然后再次使用ar
生成一个新图书馆。虽然这是可能的,但我认为将所有库都包含到您的库中并不是一个好主意。我认为最好 link 针对所有需要的库,因为这样可以确保应用程序 link 针对可用的最新版本进行编辑——而如果您将一个库嵌入到您的库中,则将坚持该版本,直到您升级它。