【问题标题】:Makefile link issueMakefile链接问题
【发布时间】:2020-08-30 17:25:06
【问题描述】:

我不知道如何在 Makefile 中链接静态库。我使用 ubuntu 20.04 LTS。我什至尝试使用这些库的直接路径,但问题仍然没有改变。这是我的 Makefile 代码。

LIB = libgeoms.a

SRC =   mlx_pxl_put.c   \
        std_arc.c       \
        std_crcl.c      \
        std_line.c      \
        std_poly.c      \
        std_rect.c      \

CC = clang
WARNS = -Wall -Wextra -Werror
OBJ = $(SRC:.c=.o)
SRCP = /usr/local/wealdboar/src/
INCLUDEP = /usr/local/wealdboar/include/
LIBP = /usr/local/wealdboar/lib/
HEADER = geoms.h
LX11P = /usr/lib/x86_64-linux-gnu/libX11.a
LXEXTP = /usr/lib/x86_64-linux-gnu/libXext.a
LMLX = /usr/local/lib/libmlx.a

$(LIB): $(OBJ)
    @echo "Every funtion is compile proved ..."
    @ar rcs $(LIB) $(OBJ)
    @echo  "All functions added to static lib ..."

$(OBJ): %.o :%.c
    @echo "check $< to be right"
    @$(CC) $(WARNS) -c $(LX11P) $(LMLX) $(LXEXTP) $< -o $@

all: $(LIB)

clean:
    @echo "removing all binaries ..."
    @rm -rf $(OBJ)

fclean: clean
    @echo "removing static library ..."
    @rm -rf $(LIB)

re: fclean all

install: re clean
    @echo "coping $(LIB) to $(LIBP)"
    @sudo cp $(LIB) $(LIBP)
    @echo "coping sources to $(SRCP)"
    @sudo cp $(SRC) $(SRCP)
    @echo "coping header to $(INCLUDEP)"
    @sudo cp $(HEADER) $(INCLUDEP)

Issue image

【问题讨论】:

  • 什么是“问题”?你还没有向我们展示发生了什么,你得到了什么错误,什么不起作用等等。但是,我会说库链接到 executables 并且你试图将它们链接到目标文件,不能工作。
  • 错误在“问题图像”中。我无法构建静态库 libgeoms.a,因为出现错误:'clang: error: -l: 'linker' input used [-Werror, -Wunused-command-line-argument]'

标签: c linux makefile


【解决方案1】:

您尚未指定 -l-L 标志来告诉 clang 链接到选定的库。

【讨论】:

  • 我改变了@$(CC) $(WARNS) -c $(LX11P) $(LMLX) $(LXEXTP) $&lt; -o $@ to @$(CC) $(WARNS) -c $, and also there are two variables LXS = /usr/lib/x86_64-linux-gnu/` 和 LMLX = /usr/local/lib。问题仍然存在:'linker' input未使用所有静态库
  • -L 标志使您可以将目录添加到库搜索路径,您应该改用-l
【解决方案2】:

首先请不要在 StackOverflow 中粘贴图片链接。它们不可搜索,不可引用,而且许多人不愿意点击指向其他网站的链接。请剪切并粘贴实际消息。

其次,在使用 makefile 时,您不应使用 @ 选项,它隐藏了有关正在运行的命令的最重要信息。当命令行不可见时,调试生成文件要困难得多。如果你真的想隐藏实际的命令,你应该在一切都已经工作之后而不是之前添加@,或者使用tricks like this 来允许调试模式。

最后你的错误正如我在上面的评论中所建议的那样。您正在尝试将静态库添加到 compile 命令(将源文件编译为目标文件的命令)。库只能添加到 link 命令(将目标文件和库转换为可执行文件的命令)中。

您实际上并没有在我可以看到的 makefile 中的任何位置创建可执行文件,因此您无法在此处添加库。但是,您需要将它们从编译规则中删除:

$(OBJ): %.o :%.c
        @echo "check $< to be right"
        @$(CC) $(WARNS) -c $< -o $@

【讨论】:

  • 感谢您的帮助。这个提示真的帮助了我,现在静态库已经构建好了。当它用于构建可执行文件时,我不知道应该使用链接器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多