C++ makefile链接不起作用(尽管没有错误消息)
我对生成的Makefile有问题。它由一个包含main()的.cpp文件组成,我想从中创建可执行文件。在输入terminalmake命令时,我得到以下信息:C++ makefile链接不起作用(尽管没有错误消息),c++,linux,makefile,linker,C++,Linux,Makefile,Linker,我对生成的Makefile有问题。它由一个包含main()的.cpp文件组成,我想从中创建可执行文件。在输入terminalmake命令时,我得到以下信息: g++ STutorial.o -o MyExecutable g++: error: STutorial.o: No such file or directory g++: fatal error: no input files 当你先把制作成STutorial.o(.o已创建)然后再把制作成时,得到以下信息: g++ STutoria
g++ STutorial.o -o MyExecutable
g++: error: STutorial.o: No such file or directory
g++: fatal error: no input files
当你先把制作成STutorial.o(.o已创建)然后再把制作成时,得到以下信息:
g++ STutorial.o -o MyExecutable
STutorial.o: In function `main':
STutorial.cpp:(.text+0x47a): undefined reference to `alcOpenDevice'
首先,为什么使从一开始就不走?
其次,为什么这个引用是未定义的,好像我没有包含库一样,我在Makefile和STutorial.cpp文件中都这么做了。
你能帮帮我吗?我在读我会做错什么,却看不到任何线索。(我是初学者,可能是新手犯的错误,我提前道歉,但无法独自理解)
生成文件:
FLAGS += -std=c++11
CCX=g++
FLAGS +=-c -Wall #for compilation, for warning
FLAGS += -lopenal -lSDL
all: MyExecutable
MyExecutable:
$(CXX) STutorial.o -o MyExecutable
STutorial.o: STutorial.cpp
$(CXX) $(FLAGS) STutorial.cpp
这是您应该做的:
g++ -std=c++11 -Wall -lopenal -lSDL STutorial.cpp -o MyExecutable
这是您应该做的:
g++ -std=c++11 -Wall -lopenal -lSDL STutorial.cpp -o MyExecutable
您的makefile应该如下所示:
CCX=g++
FLAGS +=-c -Wall #for compilation, for warning
LINK_FLAGS += -lopenal -lSDL
all: MyExecutable
MyExecutable: Stutorial.o
$(CXX) STutorial.o -o MyExecutable $(LINK_FLAGS)
STutorial.o: STutorial.cpp
$(CXX) $(FLAGS) STutorial.cpp
说明:
您的MyExecutable
取决于Stutorial.o
哪个inturn取决于Stutorial.cpp
现在,-c
标志只能与.cpp
文件一起使用以创建对象文件,而不能与已创建的.o
文件一起使用
因此,您应该有两个标志:
flags
用于编译,以及LINK\u flags
用于在生成可执行文件期间链接库。您的生成文件应该如下所示:
CCX=g++
FLAGS +=-c -Wall #for compilation, for warning
LINK_FLAGS += -lopenal -lSDL
all: MyExecutable
MyExecutable: Stutorial.o
$(CXX) STutorial.o -o MyExecutable $(LINK_FLAGS)
STutorial.o: STutorial.cpp
$(CXX) $(FLAGS) STutorial.cpp
说明:
您的MyExecutable
取决于Stutorial.o
哪个inturn取决于Stutorial.cpp
现在,-c
标志只能与.cpp
文件一起使用以创建对象文件,而不能与已创建的.o
文件一起使用
因此,您应该有两个标志:
flags
用于编译,以及LINK\u flags
用于在生成可执行文件期间链接库。您的可执行规则是:
MyExecutable:
$(CXX) STutorial.o -o MyExecutable
它有一个目标(MyExecutable
)和一个配方($(CXX)…),看起来都不错。但前提条件是什么MyExecutable
确实有先决条件-它需要STutorial.o
才能生成二进制文件!您需要明确地告诉make:
MyExecutable: STutorial.o
$(CXX) STutorial.o -o MyExecutable
否则,您将告诉make您想要构建all
<代码>全部取决于MyExecutable
MyExecutable
不依赖于任何东西,因此STutorial.o
的规则永远不会运行
至于链接器错误,您没有在所需的库中进行链接,因此您应该定义如下内容:
LFLAGS += -lopenal -lSDL
MyExecutable: STutorial.o
$(CXX) STutorial.o $(LFLAGS) -o MyExecutable
您的可执行规则是一个问题:
MyExecutable:
$(CXX) STutorial.o -o MyExecutable
它有一个目标(MyExecutable
)和一个配方($(CXX)…),看起来都不错。但前提条件是什么MyExecutable
确实有先决条件-它需要STutorial.o
才能生成二进制文件!您需要明确地告诉make:
MyExecutable: STutorial.o
$(CXX) STutorial.o -o MyExecutable
否则,您将告诉make您想要构建all
<代码>全部取决于MyExecutable
MyExecutable
不依赖于任何东西,因此STutorial.o
的规则永远不会运行
至于链接器错误,您没有在所需的库中进行链接,因此您应该定义如下内容:
LFLAGS += -lopenal -lSDL
MyExecutable: STutorial.o
$(CXX) STutorial.o $(LFLAGS) -o MyExecutable
您的Makefile中有一些问题,首先是:
FLAGS +=-c -Wall #for compilation, for warning
FLAGS += -lopenal -lSDL
您在这里重新定义FLAGS变量。
因此,对于编译器和链接器标志,您应该有一个不同的变量:
CFLAGS +=-c -Wall #for compilation, for warning
LDFLAGS += -lopenal -lSDL
现在,为了给出完整的答案,而不是仅仅解决眼前的问题,我将尝试演示如何使Makefile更加灵活:
SOURCES = STutorial.cpp
.cpp.o:
$(C++) $(CFLAGS) -o $@ $<
$(MyExecutable): $(OBJ)
$(C++) $(LDFLAGS) $(OBJ) -o $@
clean:
$(RM) $(EXECUTABLE) $(OBJ)
CCX=g++
CFLAGS +=-c -Wall -std=c++11#for compilation, for warning
LDFLAGS += -lopenal -lSDL
SOURCES = STutorial.cpp
OBJ = $(SOURCES:.cpp=.o)
all: $(MyExecutable)
$(MyExecutable): $(OBJ)
$(CCX) $(LDFLAGS) $(OBJ) -o $@
.cpp.o:
$(CCx) $(CFLAGS) -o $@ $<
clean:
$(RM) $(EXECUTABLE) $(OBJ)
CCX=g++
CFLAGS+=-c-Wall-std=c++11#用于编译,用于警告
LDFLAGS+=-lopenal-lSDL
来源=STutorial.cpp
OBJ=$(来源:.cpp=.o)
全部:$(MyExecutable)
$(MyExecutable):$(OBJ)
$(CCX)$(LDFLAGS)$(OBJ)-o$@
.cpp.o:
$(CCx)$(CFLAGS)-o$@$<
清洁:
$(RM)$(可执行文件)$(OBJ)
这将允许您灵活地构建、重建和清理项目。您的Makefile中有一些问题,首先是:
FLAGS +=-c -Wall #for compilation, for warning
FLAGS += -lopenal -lSDL
您在这里重新定义FLAGS变量。
因此,对于编译器和链接器标志,您应该有一个不同的变量:
CFLAGS +=-c -Wall #for compilation, for warning
LDFLAGS += -lopenal -lSDL
现在,为了给出完整的答案,而不是仅仅解决眼前的问题,我将尝试演示如何使Makefile更加灵活:
SOURCES = STutorial.cpp
.cpp.o:
$(C++) $(CFLAGS) -o $@ $<
$(MyExecutable): $(OBJ)
$(C++) $(LDFLAGS) $(OBJ) -o $@
clean:
$(RM) $(EXECUTABLE) $(OBJ)
CCX=g++
CFLAGS +=-c -Wall -std=c++11#for compilation, for warning
LDFLAGS += -lopenal -lSDL
SOURCES = STutorial.cpp
OBJ = $(SOURCES:.cpp=.o)
all: $(MyExecutable)
$(MyExecutable): $(OBJ)
$(CCX) $(LDFLAGS) $(OBJ) -o $@
.cpp.o:
$(CCx) $(CFLAGS) -o $@ $<
clean:
$(RM) $(EXECUTABLE) $(OBJ)
CCX=g++
CFLAGS+=-c-Wall-std=c++11#用于编译,用于警告
LDFLAGS+=-lopenal-lSDL
来源=STutorial.cpp
OBJ=$(来源:.cpp=.o)
全部:$(MyExecutable)
$(MyExecutable):$(OBJ)
$(CCX)$(LDFLAGS)$(OBJ)-o$@
.cpp.o:
$(CCx)$(CFLAGS)-o$@$<
清洁:
$(RM)$(可执行文件)$(OBJ)
这将允许您灵活地构建、重建和清理项目。但这将MyExecutable创建为对象,而不是可执行文件。您能解释一下吗?删除
-c
标志,它将是可执行的。但这创建了MyExecutable作为对象,而不是可执行文件。您能解释一下吗?删除-c
标志,它将是可执行的。问题是什么?我懂你