ncurses是libgame.so的依赖项,而不是主可执行文件的依赖项.因此,如果卸载动态库并加载更改后的版本,还可以卸载ncurses,然后再次加载它.但是你没有重新初始化它.这就是你的程序失败的原因.
正确的解决方案是在game_unload中调用endwin()来清理ncurses的状态,然后在game_reload中重新初始化它:
static void game_reload(struct game_state *state)
{
initscr();
raw();
timeout(0);
noecho();
curs_set(0);
keypad(stdscr, TRUE);
}
static void game_unload(struct game_state *state)
{
endwin();
}
另一种解决方案是强制链接器将ncurses链接到主可执行文件.这将阻止动态链接器在卸载游戏库时卸载它.您可以通过在编译主可执行文件时在$(LDLIBS)变量之前添加-Wl, – no-as-needed标志来实现此目的:
main : main.c game.h
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -Wl,--no-as-needed $(LDLIBS)
如果您更喜欢此解决方案,请考虑将ncurses初始化/清除移动到main.c文件.没有技术原因,这只是一个干净的编码风格的问题.