Makefile 错误:找不到命令 - 创建共享库时
Posted
技术标签:
【中文标题】Makefile 错误:找不到命令 - 创建共享库时【英文标题】:Makefile Error : Command Not Found- while creating a shared library 【发布时间】:2010-10-16 04:01:20 【问题描述】:我有 4 个 .c 文件 hello.c
、here.c
、bye.c
和 main.c
。
一个头文件mylib.h
内容如下
你好.c
#include<stdio.h>
void hello()
printf("Hello!\n");
这里.c
#include<stdio.h>
void here()
printf("I am here \n");
再见.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 制作:gcc:找不到命令 make: * [hello.o] 错误 127
问题:How do I resolve this?
【问题讨论】:
您确定 main.c 文件与您运行 make 命令的目录相同吗? @Ziffusion - 感谢您的富有洞察力的评论。我相信某处 main.c 文件已被删除。我现在写了一个新的 main.c 并放在文件夹中。但是现在我得到'gcc -Wall -fPIC -c -o hello.o hello.c make: gcc: Command not found make: *** [hello.o] Error 127' 你可以发布调试输出吗? 那是因为您在 Makefile 中设置了 PATH 的值。因此,shell 无法找到 gcc。尝试将 Makefile 中的 PATH 变量重命名为 LIBPATH(在所有位置)。 @Ziffusion:+1。谢谢,我不可能知道这一点。现在我收到错误 - /usr/bin/ld:cannot find -lmylib collect2: ld returned 1 exit status make: *** [main] Error 1
不确定链接器为什么找不到文件。
【参考方案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 输出。
【讨论】:
我想这可行:)。输出 gcc -Wall -c -fPIC -c -o hello.o hello.c gcc -Wall -c -fPIC -c -o here.o here.c gcc -Wall -c -fPIC -c -o bye.o bye.c gcc -shared -Wl,-soname,libmylib.so.0 -o libmylib.so.0.1 hello.o here.o bye.o ln -sf libmylib.so.0.1 libmylib.so.0.1.0 ln - sf libmylib.so.0.1.0 libmylib.so gcc -Wl,-Bdynamic -o main main.c -L/home/srinivasa/cspp51081/labs/srinivasa.lab2.1 -lmylib 好吧,给你。没那么容易:) 感谢所有的帮助和时间。现在看到输出我做了以下 1. 设置库路径:export LD_LIBRARY_PATH=/home/srinivasa/cspp51081/labs/srinivasa.lab2.1 2. 重新编译 3. ldd main - 我看到主找不到共享库ldd main linux-vdso.so.1 => (0x00007fff89ef2000) libmylib.so.0 => 未找到 libc.so.6 => /lib/libc.so.6 (0x00007f1d4d94d000) /lib64/ld-linux-x86- 64.so.2 (0x00007f1d4dca1000) 我不确定我明白了。当您运行可执行文件时会发生这种情况?找不到哪个共享库?【参考方案2】:我可以看到一些错误(只是拼写错误):
-
和 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
^ ^^^^^^^^
【讨论】:
谢谢,改变了问题。希望你能看到变化是什么。【参考方案3】:尝试将此行更改为:
$(CC) -o $(PROG) $(PORG_OBJS) -l$(LIB) -L$(LIBPATH)
到:
$(CC) -o $(PROG) $(PORG_OBJS) -L$(LIBPATH) -l$(LIB)
-L 标志需要在 -l 标志之前。
【讨论】:
@Ziffusion - 改变了它。得到同样的错误 gcc -o main main.c -L/home/srinivasa/cspp51081/labs/srinivasa.lab2.1 -lmylib /usr/bin/ld: 找不到 -lmylib collect2: ld returned 1 exit status make: * ** [main] 错误 1 好吧,首先检查目录,看看正在生成哪些库文件。接下来,尝试将“-dynamic”标志传递给编译器。然后发布整个 make 输出(包括库构建和可执行构建)。 哦,我看到您正在使用 DYNLINKFLAGS,但您从未定义它。很有可能您实际上正在生成一个静态库,即使它具有“.so”后缀。 @Ziffusion:正在创建库libmylib.so.0 -> libmylib.so libmylib.so -> libmylib.so.0.1 libmylib.so.0.1 -> libmylib.so.0.1.0
@Ziffusion - 输出:` gcc -Wall -c -fPIC -c -o hello.o hello.c gcc -Wall -c -fPIC -c -o here.o here.c gcc -Wall -c -fPIC -c -o bye.o bye.c gcc -dynamic -shared -W1,-soname,libmylib.so.0 hello.o here.o bye.o ln -sf libmylib.so.0.1。 0 libmylib.so.0.1 ln -sf libmylib.so.0.1 libmylib.so ln -sf libmylib.so libmylib.so.0 gcc -o main main.c -L/home/srinivasa/cspp51081/labs/srinivasa.lab2。 1 -lmylib /usr/bin/ld: 找不到 -lmylib collect2: ld 返回 1 退出状态 make: *** [main] Error 1`【参考方案4】:
好的。第一个变化:
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
然后发布库链接和最终的可执行链接。
【讨论】:
制作输出:gcc -Wall -c -fPIC -c -o hello.o hello.c gcc -Wall -c -fPIC -c -o here.o here.c gcc -Wall -c -fPIC -c -o bye.o bye.c gcc -dynamic -shared -W1,-soname,libmylib.so hello.o here.o bye.o ln -sf libmylib.so libmylib.so.0.1.0 ln - sf libmylib.so libmylib.so.0.1 ln -sf libmylib.so libmylib.so.0 gcc -o main main.c -L/home/srinivasa/cspp51081/labs/srinivasa.lab2.1 -lmylib /usr/bin/ ld: 找不到 -lmylib collect2: ld 返回 1 退出状态 make: *** [main] Error 1 库链接:libmylib.so.0 -> libmylib.so libmylib.so.0.1 -> libmylib.so libmylib.so.0.1.0 -> libmylib.so 现在将“-dynamic”添加到可执行文件的最终链接。然后发布 make 输出。 gcc -Wall -c -fPIC -c -o hello.o hello.c gcc -Wall -c -fPIC -c -o here.o here.c gcc -Wall -c -fPIC - c -o bye.o bye.c gcc -dynamic -shared -W1,-soname,libmylib.so hello.o here.o bye.o ln -sf libmylib.so libmylib.so.0.1.0 ln -sf libmylib.所以 libmylib.so.0.1 ln -sf libmylib.so libmylib.so.0 gcc -dynamic -o main main.c -L/home/srinivasa/cspp51081/labs/srinivasa.lab2.1 -lmylib main.c:1:警告:C 解析器不支持 -dy,选项被忽略 /usr/bin/ld:找不到 -lmylib collect2:ld 返回 1 退出状态 make:*** [main] 错误 1 希望 -dynamic 标志在正确的位置 现在将“-dynamic”替换为“-Wl,-Bdynamic”(仅在最终的可执行链接中)。并发布 make 输出。以上是关于Makefile 错误:找不到命令 - 创建共享库时的主要内容,如果未能解决你的问题,请参考以下文章
LIBPATHS 未在 Makefile 中使用,找不到共享对象