Makefile 错误:找不到命令 - 创建共享库时

Posted

技术标签:

【中文标题】Makefile 错误:找不到命令 - 创建共享库时【英文标题】:Makefile Error : Command Not Found- while creating a shared library 【发布时间】:2010-10-16 04:01:20 【问题描述】:

我有 4 个 .c 文件 hello.chere.cbye.cmain.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 -&gt; libmylib.so libmylib.so -&gt; libmylib.so.0.1 libmylib.so.0.1 -&gt; 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 中使用,找不到共享对象

在travis CI上运行Makefile时找不到gcc命令

Ubuntu 安装MySQL报共享库找不到

MSYS 错误“rem:找不到命令”

运行可执行文件时找不到共享库,即使共享库存在于指定路径中

目标嵌入在包含的Makefile中时找不到目标命令