将C程序与makefile链接时出错

时间:2015-07-19 18:53:29

标签: c linux makefile

使用此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的静态库

我该如何解决这个问题?感谢。

2 个答案:

答案 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