使用此makefile链接这个简单的C程序时遇到问题。 我在makefile中包含了名为anagrammes.h的lib,但错误似乎来自exemple.c
makefile:
all: exemple
exemple: exemple.o
exemple.o: exemple.c anagrammes.h
gcc -o exemple.o -c exemple.c -Wall
clean:
rm -rf *.o
例如:
#include <stdio.h>
#include <string.h>
#include <anagrammes.h>
int main(void)
{
int i;
char buf[]="chien";
printf("\n signature:\n");
printf("s(%s) = %s\n", buf, signature(buf));
printf("\n anagramme:\n");
anagramme(buf,0,strlen(buf));
printf("\n getNiemeP:\n");
for(i=1;i<=fact(strlen(buf));i++) {
printf("%d %s\n",i,getNiemeP(buf, i));
}
}
编辑:感谢大家帮助我。 以下是我收到的错误消息:
Erreur:
exemple.c: In function ‘main’:
exemple.c:20:1: attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type]
/tmp/ccPXm1wV.o: In function `main':
exemple.c:(.text+0x39): undefined reference to `signature'
exemple.c:(.text+0x98): undefined reference to `anagramme'
exemple.c:(.text+0xc2): undefined reference to `getNiemeP'
exemple.c:(.text+0x112): undefined reference to `fact'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [exemple] Erreur 1
**我还有一个名为libannagrammes.a的静态库
我该如何解决这个问题?感谢。
答案 0 :(得分:3)
假设问题(因为你未能真正指出实际问题)是由于缺少符号导致链接失败,那么解决方案是修改makefile并替换
exemple: exemple.o
带
exemple: exemple.o anagrammes.o
指示需要将exemple.o
和 anagrammes.o
链接到exemple
可执行文件中。
所以你得到一个像这样的makefile:
all: exemple
exemple: exemple.o anagrammes.o
exemple.o: exemple.c anagrammes.h
gcc -o exemple.o -c exemple.c -Wall
clean:
rm -rf *.o
据说你根本不需要exemple.o
规则,也可以使用内置规则(就像你对exemple
所做的那样)。
all: exemple
CFLAGS += -Wall
exemple: exemple.o anagrammes.o
exemple.o: exemple.c anagrammes.h
clean:
rm -rf *.o
答案 1 :(得分:1)
您只添加了头文件annagramme.h,因此编译器知道在那里声明的函数等。但是,lib是* .o或* .so(共享库),您需要为exemple指定编译器命令行(指定要链接的库和目标文件)以生成可执行文件。例如
all: exemple
exemple: exemple.o
gcc -L<dir with libannagrammes.a> -o exemple exemple.o -lannagrammes
exemple.o: exemple.c anagrammes.h
gcc -o exemple.o -c exemple.c -Wall
clean:
rm -rf *.o
注意:如果您的LIB_PATH上没有lib,则需要使用-L选项指定查找位置的位置(另请参阅https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options)