【问题标题】:C programing Makefile in linuxC语言在Linux中编写Makefile
【发布时间】:2014-04-23 21:31:21
【问题描述】:

谁能帮帮我因为我不确定是什么问题我认为我在 Makefile 中做错了什么因为无法运行它我得到错误

程序:drevoProcesov.c`

#include <sys/types.h>`  
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>`

void izpis()
{
printf("PID: %d  PPID: %d \n", getpid(), getppid());
}

int main(int argc, char *argv[])
{
    /*levo*/
    if(fork()==0)
    {
            if(fork()==0)
            {
                    if(fork()==0)
                    {
                            izpis();
                            exit(0);                       
                    }              
                    else
                    {
                            wait(0);       
                            izpis();                       
                    }
                    exit(0);
            }
            else
            {
                    wait(0);
                    wait(0);
                    wait(0);
                    izpis();
            }
    }      
    /*desno*/
    else
    {
            wait(0);
            if(fork()==0)
            {  
                    if(fork()==0)
                    {
                            izpis();
                            exit(0);
                    }
                    else
                    {
                            wait(0);
                            if(fork()==0)
                            {
                                    izpis();
                                    exit(0);
                            }
                            else
                            {
                                    wait(0);
                                    if(fork()==0)
                                    {
                                            izpis();
                                            exit(0);
                                    }
                                    else
                                    {
                                            wait(0);
                                            izpis();
                                    }
                            }
                    }
                    exit(0);
            }
            else
            {
                    wait(0);
                    izpis();
            }
    }
    return 0;

}

制作文件

CC=gcc
LDFLAGS=-lm -g3 -lpthread -Wall
TARGET=drevoProcesov
all: $(TARGET)

clean:
rm -rf $(TARGET)
rm -rf *.o

这是我得到的错误:drevoProcesov.c

./drevoProcesov.c: line 7: syntax error near unexpected token `('
./drevoProcesov.c: line 7: `void izpis()'

程序 2 vsotast.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int *vsota;

int main(int argc,char *argv[]) {

if (argc != 2) {
  printf("Napaka v podajanju argumentov!\nPrimer: ./vsotast 5\n");
  return -1;
}

int n = atoi(argv[1]);

vsota = (int *)malloc(sizeof(int));
*vsota = 0;

int ret;
for (int i=0; i<n; i++)
{
  ret = fork();
  if (ret== 0) {
     *vsota = (*vsota + (i+1));

     //printf("VSOTA: %d; I+1: %d\n",*vsota, i+1);

     /*if (i == n-1)
        printf("Vsota, ki so jo izračunali sinovi: %d\n", *vsota);*/

     exit(0);
  } else {
     wait(&ret);
  }      
}

int sum = ((n*(1+n))/(2));

printf("Vsota, ki so jo izračunali sinovi: %d\n", *vsota);
printf("Vsota, ki jo izračunal oce: %d\n",sum);

free(vsota);

return 0;
}

制作文件 2

CC = gcc
LDFLAGS = -lm -g3 -lpthread -Wall
CFLAGS = -g
TARGET = vsotast

all: $(TARGET)

clean:
rm -rf $(TARGET)
rm -rf *.o

这是我得到的错误:vsotast.c

gcc -g  -lm -g3 -lpthread -Wall  vsotast.c   -o vsotast
vsotast.c: In function ‘main’:
vsotast.c:22:4: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i=0; i<n; i++)
^
vsotast.c:22:4: note: use option -std=c99 or -std=gnu99 to compile your code

【问题讨论】:

  • ` 字符是您的代码的一部分,还是复制粘贴错误?

标签: c linux makefile


【解决方案1】:

vsotast.c 错误是由于 C99 之前的 for 循环表达式中不允许声明,因此您需要启用 C99 模式或将声明移出 for 表达式:

int i;
for (i = 0; i < n; i++)

【讨论】:

  • 实际上,他/她甚至不能这样做,因为在“传统”C 变量声明中应该发生在代码指令之前(即在 if (argc != 2) { 之前。所以切换到“C99”(甚至-std=C11 如果 GCC 足够新鲜 :) ) 是这里的最佳选择 :)
  • @user3159253 确实如此,但编译器没有抱怨int ret; 声明的事实告诉我,它不在乎它的模式。但我同意明确使用支持这些功能的 C 版本将是首选解决方案。
【解决方案2】:

不是一个完整的答案,只是(更长的)想法:

  1. 正确缩进你的Makefiles。这对他们来说至关重要。
  2. 编译器错误几乎与 Makefile 无关 - 如果编译器运行,那么您创建了或多或少正确的 Makefile,问题出在您的代码中 :)

在这种特殊情况下,有问题的字符串是

for (int i=0; i<n; i++)

它是 C,而不是 C++,你不能在 for 语句中声明循环变量,除非你将 -std=c99 标志传递给编译器(为此在 Makefile 中使用 CFLAGS

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2012-07-09
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多