【问题标题】:How do I compile using minilibx?如何使用 minilibx 进行编译?
【发布时间】:2019-12-11 13:50:28
【问题描述】:

我正在学校 (Mac OSX) 进行练习,并想在家里继续 (Ubuntu 16.04)。 要完成这个项目,我需要使用一个库:Minilibx (https://github.com/ttshivhula/minilibx) 我在尝试 gcc 时遇到了问题。这是 gcc 告诉我的:“mlx_init.c:(.text+0x2c) : référence indéfinie vers « XShmQueryVersion »”(未定义的英文参考)。 对于每个库(甚至 math.h),都有很多这样的错误。 在学校编译没有问题,但是在家里就不行了。

我用这一行编译:

gcc -Wall -Werror -Wextra -std=gnu99 -I. -g -lm -lGLEW -lglfw -lGL ${OBJS} minilibx/libmlx_Linux.a -o ${NAME}

与:

OBJS = ${SRC:%.c=%.o}

SRC = cub3d.c ${addprefix ${GNL_PATH}, $(GNL_FILE)} ${addprefix ${LIB_PATH}, $(LIB_FILE)}

GNL 和 LIB 是我的两个个人图书馆。

我试图改变我的编译方式,但我找不到问题所在。

【问题讨论】:

标签: c gcc compiler-errors


【解决方案1】:

经验法则:在链接命令行中,库位于目标文件之后,而不是在它们之前。

如果你把库放在目标文件之前,一些系统将不会记录库定义的符号,因为没有对库中任何函数的未完成的未定义引用,因为命令行是从左到右处理的,因此在扫描目标文件时,不会重新扫描库。

改变这个:

gcc -Wall -Werror -Wextra -std=gnu99 -I. -g -lm -lGLEW -lglfw -lGL ${OBJS} \
    minilibx/libmlx_Linux.a -o ${NAME}

到:

gcc -Wall -Werror -Wextra -std=gnu99 -I. -g ${OBJS} -lm -lGLEW -lglfw -lGL \
    minilibx/libmlx_Linux.a -o ${NAME}

现在您有机会链接这些功能。在 Mac 上,使用 -lm 是不必要但无害的;数学函数在主系统库中。其他系统,尤其是 Linux,仍然有一个单独的数学库——主要是为了歇斯底里的葡萄干(……呃,历史原因……)。

我不会惊讶地发现您也需要将 minilibx/libmlx_Linux.a 参数放在命令行的前面 — 紧跟在 ${OBJS} 之后。

【讨论】:

  • 非常感谢您花时间解释。现在我明白了! :)
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2021-08-18
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多