我有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是: 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作: gcc:命令未找到:* hello.o错误127
问题:How do I resolve this?
发布于 2010-10-16 00:00:02
+++++
好的。让我们恢复到原来的代码,但差别很小。
将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输出。
发布于 2010-10-15 20:11:19
我可以看到有几个bug(只是打字)是:
-
和Wall
之间的空间:^
PORG_OBJS
=- Wall -c -fPIC -fPIC应为PROG_OBJS
$(CC) -o $(PROG) $(PORG_OBJS) -L$(PATH) ^
PATH
执行绝对赋值。现在,在makefile中调用的每个可执行文件都将在该目录中搜索。由于在该目录中找不到gcc
,所以会出现此错误。要解决这个问题,可以使用不同的变量名,也可以将目录添加到当前路径,如下所示:路径$(PATH):/home/srinivasa/cspp51081/labs/srinivasa.lab2.1 ^
发布于 2010-10-15 21:56:00
尝试从以下位置更改这一行:
$(CC) -o $(PROG) $(PORG_OBJS) -l$(LIB) -L$(LIBPATH)
至:
$(CC) -o $(PROG) $(PORG_OBJS) -L$(LIBPATH) -l$(LIB)
-L标志需要在-l标志之前。
https://stackoverflow.com/questions/3947622
复制