使用 makefile 编译 C 项目

标签 c linux compilation compiler-errors makefile

我有一个名为 reliability 的目录:

ls reliability
analyze.c  appl.sh  constr.c  creer.c  greedys.c  Makefile

现在我要安装并编译它:

首先Makefile的内容是:

CC = gcc
CFLAGS = -g -Wall -pthread

SRCS = constr.c creer.c analyze.c greedys.c
PROG = constr creer analyze greedys

all: $(PROG)

constr: constr.c
        $(CC) $(CFLAGS) -o constr constr.c

creer: creer.c
        $(CC) $(CFLAGS) -o creer creer.c

analyze: analyze.c
        $(CC) $(CFLAGS) -o analyze analyze.c

greedys: greedys.c
        $(CC) $(CFLAGS) -o greedys greedys.c

clean: 
        rm -f $(PROG)

当我开始编译它时:

make -f Makefile 

出现错误:

gcc -g -Wall -pthread -o constr constr.c
/tmp/cca4NKQl.o: In function `main':
/home/t1/Desktop/reliability/constr.c:89: undefined reference to `exp'
/home/t1/Desktop/reliability/constr.c:89: undefined reference to `exp'
/home/t1/Desktop/reliability/constr.c:89: undefined reference to `pow'
/home/t1/Desktop/reliability/constr.c:89: undefined reference to `log'
collect2: ld returned 1 exit status
make: *** [constr] Error 1

我通过将 -lm 添加到 gcc 来传递这些错误,

即使我将 CFLAGSMakefile 更改为 CFLAGS = -g -Wall -pthread -lm ,也会出现该错误。

我的问题:

我现在应该单独编译所有的.c程序吗?

谢谢你,我真的需要帮助,

更新

编译creer.c时出现错误:

creer.c:39:10: warning: unused variable ‘val2’ [-Wunused-variable] creer.c:38:7:
               warning: unused variable ‘val’ [-Wunused-variable]

creer.c 的一部分是:

void values(){
  int val;
  double val2;
  FILE *fp;
  fp = fopen("instances","r");
  fseek(fp,0,SEEK_SET);
  if(fscanf(fp,"%d",&p)==EOF){printf("EOF\n");}
  if(fscanf(fp,"%d",&m)==EOF){printf("EOF\n");}
  if(fscanf(fp,"%d",&K)==EOF){printf("EOF\n");}
  if(fscanf(fp,"%lf",&lambda_com)==EOF){printf("EOF\n");}
  if(fscanf(fp,"%d",&num_inst)==EOF){printf("EOF\n");}
  if(fscanf(fp,"%d",&boundl)==EOF){printf("EOF\n");}
  if(fscanf(fp,"%d",&boundp)==EOF){printf("EOF\n");}
  fclose(fp);
}

最佳答案

您需要将该链接器选项 -lm 添加到命令行的末尾。

做这样的事情:

LDFLAGS=-lm

...

constr: constr.c    
        $(CC) $(CFLAGS) -o constr constr.c $(LDFLAGS)

或者您可以定义一个模式规则:

%: %.c
        $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)

并用它来替换 constr、creer 等的所有规则。

关于使用 makefile 编译 C 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486375/

相关文章:

c++ - 分配内存和保留内存有什么区别?

linux - apache 虚拟主机子域只能由本地主机访问

ruby -MCollective : how to get the output of a command into a ruby variable (or object)

c++ - 在CMake项目下编译单个文件?

c++ - 编译时检查基类是否为 "interface"

c - mmap 一个不太可能被程序的任何其他部分使用的地址

c - 如何在系统函数中合并字符串?

c++ - Code::Blocks 出现 GLUT 编译错误

c - 如何将反汇编的C代码划分为函数?

linux - 检查linux机器是否空闲