Linux Makefile 错误:未找到命令 - 创建共享库时
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3947622/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Makefile Error : Command Not Found- while creating a shared library
提问by Eternal Learner
I have 4 .c files hello.c
,here.c
,bye.c
and main.c
.
One header file mylib.h
我有4个.c文件hello.c
,here.c
,bye.c
和main.c
。一个头文件mylib.h
The contents are as follows
内容如下
hello.c
你好ç
#include<stdio.h>
void hello()
{
printf("Hello!\n");
}
here.c
这里.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
mylib.h
#ifndef _mylib_
#define _mylib_
void hello();
void here();
void bye();
#endif
The makefile for creating a static lib is : Makefile
创建静态库的makefile是:Makefile
#Which Compiler
CC = gcc
#Compiler Flags
CFLAGS = - Wall -c -fPIC
DYNLINKFLAGS = -shared -W1,-soname,[email protected]
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 $@ [email protected]
#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
Problem: When I execute the command
问题:当我执行命令时
make -f Makefile all
I get the error:
我收到错误:
gcc -Wall -fPIC -c -o hello.o hello.c make: gcc: Command not found make: *[hello.o] Error 127
gcc -Wall -fPIC -c -o hello.o hello.c make: gcc: Command not found make: *[hello.o] Error 127
Questions : How do I resolve this?
问题 : How do I resolve this?
采纳答案by Ziffusion
+++++
+++++
OK. Lets revert to your original code, but with a small difference.
好的。让我们恢复到您的原始代码,但有一点不同。
Change DYNLINKFLAGS back to:
将 DYNLINKFLAGS 改回:
DYNLINKFLAGS = -shared -Wl,-soname,[email protected]
Then change the library link to:
然后将库链接更改为:
$(CC) $(DYNLINKFLAGS) -o $(LIB_RELEASE) $^
ln -sf $(LIB_RELEASE) $(LIB_MINOR)
ln -sf $(LIB_MINOR) $@
ln -sf $@ [email protected]
Do "rm -f lib*", build and then post make output.
执行“rm -f lib*”,构建然后发布 make 输出。
回答by codaddict
There are a few bugs (just typos) I can see is:
我可以看到的一些错误(只是错别字)是:
space between
-
andWall
:CFLAGS = - Wall -c -fPIC ^
PORG_OBJS
should bePROG_OBJS
$(CC) -o $(PROG) $(PORG_OBJS) -L$(PATH) ^^^^
You are doing an absolute assignment to
PATH
. Now every executable called in makefile will be search in that directory. Sincegcc
is not found in that directory you get this error. To fix this you can either use a differentvariable name or add your directory to current path as:PATH := $(PATH):/home/srinivasa/cspp51081/labs/srinivasa.lab2.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 ^ ^^^^^^^^
回答by Ziffusion
Try changing this line from:
尝试从以下位置更改此行:
$(CC) -o $(PROG) $(PORG_OBJS) -l$(LIB) -L$(LIBPATH)
to:
到:
$(CC) -o $(PROG) $(PORG_OBJS) -L$(LIBPATH) -l$(LIB)
The -L flag needs to precede the -l flags.
-L 标志需要在 -l 标志之前。
回答by Ziffusion
OK. First change:
好的。第一个变化:
DYNLINKFLAGS = -shared -W1,-soname,[email protected]
to
到
DYNLINKFLAGS = -shared -W1,-soname,$@
Then change:
然后改变:
ln -sf $(LIB_RELEASE) $(LIB_MINOR)
ln -sf $(LIB_MINOR) $@
ln -sf $@ [email protected]
To:
到:
ln -sf $@ $(LIB_RELEASE)
ln -sf $@ $(LIB_MINOR)
ln -sf $@ [email protected]
Then post the library links and the final executable link.
然后发布库链接和最终的可执行链接。