我有4个.c文件hello.c
,here.c
,bye.c
和main.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?
答案 0 :(得分:1)
我可以看到有一些错误(只是错别字):
-
和Wall
之间的空格:
CFLAGS = - Wall -c -fPIC
^
PORG_OBJS
应为PROG_OBJS
$(CC) -o $(PROG) $(PORG_OBJS) -L$(PATH)
^^^^
您正在对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
然后发布库链接和最终的可执行链接。