Ошибка Makefile: команда не найдена - при создании общей библиотеки - PullRequest
0 голосов
/ 16 октября 2010

У меня есть 4 .c файла hello.c, here.c, bye.c и main.c. Один заголовочный файл mylib.h

Содержимое выглядит следующим образом

hello.c

#include<stdio.h>

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

здесь.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 для создания статической библиотеки: 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 ]

1 голос
/ 16 октября 2010

+++++

OK. Вернемся к исходному коду, но с небольшой разницей.

Изменить 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 make.

1 голос
/ 16 октября 2010

Попробуйте изменить эту строку с:

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

до:

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

Флагу -L должен предшествовать флаг -l.

1 голос
/ 16 октября 2010

Есть несколько ошибок (только опечатки), которые я вижу:

  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
          ^  ^^^^^^^^
    
0 голосов
/ 16 октября 2010

OK.Сначала измените:

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

Затем опубликуйте ссылки на библиотекии последняя исполняемая ссылка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...