Makefile错误:找不到命令 - 创建共享库时

时间:2010-10-16 04:01:20

标签: c linux makefile shared-libraries

我有4个.c文件hello.chere.cbye.cmain.c。 一个头文件mylib.h

内容如下

的hello.c

#include<stdio.h>

void hello()
{
    printf("Hello!\n");
}

here.c

#include<stdio.h>

void here()
{
     printf("I am here \n");
}

bye.c

#include<stdio.h>

void bye()
{
    printf("Bye,Bye");
}

main.c

#include<stdio.h>
#include "mylib.h"

int main()
{ 

  hello();
  here();
  bye();
  return 1;
}

mylib.h

#ifndef _mylib_
#define _mylib_

void hello();
void here();
void bye();

#endif

用于创建静态库的makefile是: 生成文件

#Which Compiler
CC = gcc

#Compiler Flags
CFLAGS = - Wall -c -fPIC

DYNLINKFLAGS = -shared -W1,-soname,$@.0

PROG = main

PROG_OBJS = main.c

LIB = mylib

LIB_FILES = libmylib.so

LIB_MINOR = $(LIB_FILES).0.1

LIB_RELEASE = $(LIB_MINOR).0

LIB_OBJS = hello.o here.o bye.o

PATH = /home/srinivasa/cspp51081/labs/srinivasa.lab2.1

all:    $(LIB_FILES) $(PROG)

#Create Lib with this file
$(LIB_FILES):   $(LIB_OBJS)
            $(CC) $(DYNLINKFLAGS) $^
            ln -sf $(LIB_RELEASE) $(LIB_MINOR)
            ln -sf $(LIB_MINOR) $@
            ln -sf $@ $@.0

#Compiling main program and link with shared library
$(PROG):        $(PROG_OBJS)
            $(CC) -o $(PROG) $(PORG_OBJS) -l$(LIB) -L$(PATH)

main.o:         main.c
hello.o:        hello.c
here.o:         here.c
bye.o:          bye.c

#clean files
clean:
            rm -rf $(LIB_OBJS) $(LIB_FILES) $(LIB_RELEASE) $(LIB_MINOR) libmylib.so.0

问题:当我执行命令

make -f Makefile all 

我收到错误:

gcc -Wall -fPIC -c -o hello.o hello.c make:gcc:找不到命令 make: * [hello.o]错误127

问题:How do I resolve this?

4 个答案:

答案 0 :(得分:1)

我可以看到有一些错误(只是错别字):

  1. -Wall之间的空格:

    CFLAGS = - Wall -c -fPIC
              ^
    
  2. PORG_OBJS应为PROG_OBJS

    $(CC) -o $(PROG) $(PORG_OBJS) -L$(PATH)
                       ^^^^
    
  3. 您正在对PATH进行绝对分配。现在,在makefile中调用的每个可执行文件都将在该目录中搜索。由于在该目录中找不到gcc,因此会出现此错误。要解决此问题,您可以使用不同的变量名称,也可以将目录添加到当前路径:

     PATH := $(PATH):/home/srinivasa/cspp51081/labs/srinivasa.lab2.1
          ^  ^^^^^^^^
    

答案 1 :(得分:1)

尝试从以下位置更改此行:

$(CC) -o $(PROG) $(PORG_OBJS) -l$(LIB) -L$(LIBPATH)

为:

$(CC) -o $(PROG) $(PORG_OBJS) -L$(LIBPATH) -l$(LIB)

-L标志需要在-l标志之前。

答案 2 :(得分:1)

+++++

行。让我们恢复原始代码,但差别很小。

将DYNLINKFLAGS更改回:

DYNLINKFLAGS = -shared -Wl,-soname,$@.0

然后将库链接更改为:

$(CC) $(DYNLINKFLAGS) -o $(LIB_RELEASE) $^
ln -sf $(LIB_RELEASE) $(LIB_MINOR)
ln -sf $(LIB_MINOR) $@
ln -sf $@ $@.0

执行“rm -f lib *”,构建然后发布make输出。

答案 3 :(得分:0)

行。第一次改变:

DYNLINKFLAGS = -shared -W1,-soname,$@.0

DYNLINKFLAGS = -shared -W1,-soname,$@

然后改变:

ln -sf $(LIB_RELEASE) $(LIB_MINOR)
ln -sf $(LIB_MINOR) $@
ln -sf $@ $@.0

要:

ln -sf $@ $(LIB_RELEASE)
ln -sf $@ $(LIB_MINOR)
ln -sf $@ $@.0

然后发布库链接和最终的可执行链接。