【问题标题】:Makefile: Linking .*a libraryMakefile:链接 .*a 库
【发布时间】:2013-06-06 21:22:54
【问题描述】:

说明: 我有一个库 libshel​​l.a,里面是我正在尝试使用的函数 ord_interna,但是似乎我链接错了,你们能解决我的错误,所以我以后不做了吗?干杯,

错误:

/tmp/ccn5lbmJ.o: In function `main':
minishell.c:(.text+0x4e): undefined reference to `ord_interna'
collect2: error: ld returned 1 exit status
make: *** [minishell.o] Error 1

生成文件:

CC=gcc 
CFLAGS=-Wall -pedantic -c

all: microshell

microshell: minishell.o
    gcc minishell.o -o microshell

minishell.o: minishell.c
    gcc minishell.c minishell.h entrada_minishell.c entrada_minishell.h ejecutar.c ejecutar.h libshell.a

clean:
    rm -rf *o microshell

【问题讨论】:

  • 哇,makefile 好奇怪。
  • 它在 gcc for minishell.o 的末尾,在这种情况下如何修复它?对不起,我只是不习惯使用makefile,我通常在Win中编码,但是这次我不得不这样做。
  • @PiotrJerzyMamenas 您似乎不理解为什么库和链接是必要的,也不理解它们是如何工作的。我建议你谷歌“C编译过程”然后你就会知道哪里出错了。
  • @PiotrJerzyMamenas 在第二个 gcc 行中,删除标题 (.h) 并尝试使用 -l 作为 'shell' 之前的开关(而不是 libshel​​l.a)。更好的是,从在静态库中正确链接的其他代码中找到另一个 Makefile。

标签: c linux linker makefile dynamic-library


【解决方案1】:

从你的 makefile 中,我猜你有这些源文件:

minishell.c
entrada_minishell.c
ejecutar.c

并且您想编译它们,然后将它们与libshell.a 链接在一起以创建一个名为microshell 的可执行文件。在这种情况下,您需要类似:

CC=gcc
CFLAGS=-Wall -pedantic

all: microshell

microshell: minishell.o entrada_minishell.o ejecutar.o
    $(CC) -o $@ $^ -L. -lshell

如果需要,您可以添加 clean 目标,但这应该可以让您继续前进。

编者注:

  1. 把头文件放在编译行真的很奇怪;我以为你实际上并不想这样做。

  2. 您应该查看 gcc 的 -MMD 标志来自动生成依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多