Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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链接不起作用(尽管没有错误消息)_C++_Linux_Makefile_Linker - Fatal编程技术网

C++ makefile链接不起作用(尽管没有错误消息)

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

我对生成的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++ 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
    标志,它将是可执行的。问题是什么?我懂你