【发布时间】:2013-04-03 21:16:40
【问题描述】:
我最近在 Linux 上使用 ncurses 用 C 语言编写了一个扫雷器实现;在我的电脑上一切正常,但如果我尝试将编译后的二进制文件提供给其他人,他们经常会收到错误:
error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
如果我让他们重新编译代码,一切都很好。通过环顾四周,我发现这是 libtinfo 和 libncurses 之间分离的问题。可以通过几个simlinks来解决,但是这个解决方案只有在用户有root权限的情况下才可行。
截至此处(和其他来源)http://www.cyberspice.org.uk/blog/2009/12/24/tinfo-about-dash/,似乎可以通过以不同方式编写代码或以不同方式编译来解决这个问题。我宁愿能够以这种方式解决问题,也不愿强迫人们制作 simlink。
在正确方向上的任何指示以了解如何解决我的问题?如果需要,我可以添加任何代码或细节,但发布所有内容似乎有点过头了,所以请告诉我可以添加什么(如果需要)以更好地理解问题。
我现在唯一发布的是makefile:
CC=gcc -std=gnu89 -pedantic -Wall -Wno-unused-but-set-variable
CFLAGS=-c -g
LDFLAGS=-lncurses
NAME=campo_ex
OBJECTS=error.o interface.o utilities.o main.o grid.o
DEBUG_NAME=debug
DEBUG_OBJECTS=error.o interface.o utilities.o debug.o
$(NAME): $(OBJECTS)
$(CC) -o $(NAME) $(OBJECTS) $(LDFLAGS)
main.o: main.c interface.h grid.h
$(CC) $(CFLAGS) main.c
debug.o: debug.c interface.h
$(CC) $(CFLAGS) debug.c
error.o: error.c error.h
$(CC) $(CFLAGS) error.c
utilities.o: utilities.c utilities.h
$(CC) $(CFLAGS) utilities.c
interface.o: interface.c interface.h error.h utilities.h
$(CC) $(CFLAGS) interface.c
grid.o: grid.c grid.h error.h
$(CC) $(CFLAGS) grid.c
.PHONY: clean
clean:
@-rm -f $(OBJECTS) $(NAME) $(DEBUG_NAME) $(DEBUG_OBJECTS)
.PHONY: debug
debug: $(DEBUG_OBJECTS)
$(CC) -o $(DEBUG_NAME) $(DEBUG_OBJECTS) $(LDFLAGS)
【问题讨论】:
-
如果你真的想分发二进制文件,你可以静态链接可执行文件,这样你就不会遇到任何共享库问题。
-
我想避免额外的空间,但它肯定是一个可行的选择。