Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ makefile:specific';没有输入文件';,自动变量_C++_Makefile_Automatic Variable - Fatal编程技术网

C++ makefile:specific';没有输入文件';,自动变量

C++ makefile:specific';没有输入文件';,自动变量,c++,makefile,automatic-variable,C++,Makefile,Automatic Variable,我不熟悉制作文件,它们让我困惑。我有以下文件夹层次结构: 名为lib的文件夹包含两个文件夹:include(使用文件mylib.h)和src(使用文件mylib.cpp)。它还包含一个Makefile,出于某种原因,它给了我一个错误 完整的makefile是: CFLAGS = -Wall -fPIC OBJECTS = mylib.o all: libmine.so libmine.so: $(OBJECTS) g++ -shared $(CFLAGS) \

我不熟悉制作文件,它们让我困惑。我有以下文件夹层次结构:

名为
lib
的文件夹包含两个文件夹:
include
(使用文件
mylib.h
)和
src
(使用文件
mylib.cpp
)。它还包含一个Makefile,出于某种原因,它给了我一个错误

完整的makefile是:

CFLAGS = -Wall -fPIC
OBJECTS = mylib.o

all: libmine.so

libmine.so: $(OBJECTS)
            g++ -shared $(CFLAGS) \
            -o libmine.so \
            $(OBJECTS)

%.o:        src/%.cpp include/%.h
            g++ $(CFLAGS) \
            -I include \
            -o %.o \
            -c src/%.cpp

clean:
            rm src/*.o
            rm libmine.so
错误是

mr209@Quantum:~/Desktop/hw1/lib$ make
g++ -Wall -fPIC \
            -I include \
            -o %.o \
            -c src/%.cpp
g++: error: src/%.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [mylib.o] Error 4
但是文件存在。因此,
make
正在做一些奇怪的事情,导致它无法找到
.cpp
文件

为了使
libmine.so
g++
必须使用
mylib.o
,对于一个通用
.o
文件,我已经编写了一些代码行

以下是我的想法:为了使
libmine.so
g++
必须对
mylib.o
做些什么。因此,在
lib
中,必须出现一个名为
mylib.o
的文件。使用通用的
%.0
规则,此文件由
src
中的
mylib.cpp
include
中的
mylib.h
组成(因此是
%.o
规则的第一行)。该文件是使用
g++
生成的,它必须在
include
中查找附加头,生成
mylib.o
作为输出,并编译
src/mylib.cpp
,但
-c
保证生成
.o
文件


很明显,有些地方出了问题,我不知道是什么。就在两天前,我才了解了Makefiles是什么,以及为什么要学习如何处理它们,所以我不是一个专家。

在将变量放入g之前,必须先做一个变量++ 比如:

FT_C=$(src/%.cpp)
FT_O=$(FT_C:.C=.O)

g++$(CFLAGS)-I包括-o$(FT\u-o)-c$(FT\u-c)

不要把你的.h放在编译中,'-I'是为它而来的

如果你想理解我的意思,请看这个例子:


您的构建目标
%.o
写错了。您不能在命令部分使用
%
,因此目标文件和从属文件的名称永远不会匹配

正确的更改是执行以下操作:

%.o: src/%.cpp include/%.h
    g++ $(CFLAGS) \
    -I include \
    -o $@ \
    -c src/$(@:%.o=%.cpp)
为了解释这些更改,
-o
需要目标文件,它在Makefiles中几乎总是以
$@
的形式写入,因为这是目标文件的名称

其次,源文件需要根据目标来定义,所讨论的操作符是模式替换操作符
$(@:%.o=%.cpp)
,因此它所做的是获取目标-它将匹配文件名
.o
,然后它将
.o
替换为
.cpp

因此,对于目标
mylib.o
,变量
$
mylib.o
,执行
$(@:%.o=%.cpp)
的结果是将
mylib.o
转换为
mylib.cpp
。因此,正在编译的是预期的文件,预期的目标是build

使用
%
模式的规则称为隐式规则,用于降低编写代码的复杂性-如果有一堆文件共享目标模式:
blah.o:src/blah.cpp src/blah.h
,则使用隐式规则只需编写一次目标,然后需要根据目标编写命令