makefile:未创建可执行文件

makefile: no executable created

本文关键字:可执行文件 创建 makefile      更新时间:2023-10-16

我以前使用过带有glut的openGL,以前单独使用过SDL2。现在我尝试用Glew、SDL2和OpenGL制作一个优化的项目。我希望它能够在Linux(我主要使用Debian)、OSX和Windows上运行。所以我试着写我自己的makefile。这段代码应该只为我创建一个窗口。我在osx上开发。

我只有我的main.cpp、Display.cpp和Display.h

这就是我尝试的:

#my compiler
CC=g++
#my program name
PRGNAME=booom
#library search directory
LIBDIR=-L/usr/lib -L/usr/local/lib
#library names
#uses libSDL.a, libGLEW.a
LIBNAME=-lSDL -lGLEW
#includes for libraries
INCLUDES=-I/usr/include -I/usr/local/include
#my compiler options
CFLAGS=-c -Wall

all: main.o Display.o
    $(CC) $(CFLAGS) $(INCLUDES) $(LIBDIR) $(LIBNAME) -o $(PRGNAME) main.o Display.o
#main.cpp is the dependency of main.o
main.o: main.cpp
    $(CC) $(CFLAGS) $(INCLUDES) $(LIBDIR) $(LIBNAME) main.cpp
Display.o: Display.cpp
    $(CC) $(CFLAGS) $(INCLUDES) $(LIBDIR) $(LIBNAME) Display.cpp
clean:
    rm -rf *o booom

我得到了一个main.o和一个Display.o文件,但我没有得到一个可执行文件。

当我做"使干净&&使"这是我的输出:

macbook-mehrschwein:Booom Mehrschwein$ make clean && make
rm -rf *o booom
g++ -c -Wall -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib -lSDL -lGLEW main.cpp
clang: warning: -lSDL: 'linker' input unused
clang: warning: -lGLEW: 'linker' input unused
clang: warning: argument unused during compilation: '-L/usr/lib'
clang: warning: argument unused during compilation: '-L/usr/local/lib'
g++ -c -Wall -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib -lSDL -lGLEW Display.cpp
clang: warning: -lSDL: 'linker' input unused
clang: warning: -lGLEW: 'linker' input unused
clang: warning: argument unused during compilation: '-L/usr/lib'
clang: warning: argument unused during compilation: '-L/usr/local/lib'
g++ -c -Wall -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib -lSDL -lGLEW -o booom main.o Display.o
clang: warning: -lSDL: 'linker' input unused
clang: warning: -lGLEW: 'linker' input unused
clang: warning: main.o: 'linker' input unused
clang: warning: Display.o: 'linker' input unused
clang: warning: argument unused during compilation: '-Wall'
clang: warning: argument unused during compilation: '-I /usr/include'
clang: warning: argument unused during compilation: '-I /usr/local/include'
clang: warning: argument unused during compilation: '-L/usr/lib'
clang: warning: argument unused during compilation: '-L/usr/local/lib'
macbook-mehrschwein:Booom Mehrschwein$ 

问题出在所有阶段中使用的-c标志中。它意味着编译一个对象文件,而不是链接。为all目标删除它。类似:

all: main.o Display.o
$(CC) $(LIBDIR) $(LIBNAME) -o $(PRGNAME) main.o Display.o

这修复了链接的问题。现在,请确保您指定的文件夹中有libSDL。

带有的新版本

all: main.o Display.o
    $(CC) $(LIBDIR) $(LIBNAME) -o $(PRGNAME) main.o Display.o
main.o: main.cpp
    $(CC) $(CFLAGS) $(INCLUDES) main.cpp 
Display.o: Display.cpp
    $(CC) $(CFLAGS) $(INCLUDES) Display.cpp 

不再对Display.o和main.o发出警告。

我现在得到的错误:

g++ -c -Wall -I/usr/include -I/usr/local/include main.cpp 
g++ -c -Wall -I/usr/include -I/usr/local/include Display.cpp 
g++ -Wall -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib -o booom main.o Display.o -lSDL -lGLEW
ld: library not found for -lSDL
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 1

编辑:名称是libSDL2.a,而不是libSDL.a

但现在它告诉我他找不到libGlew

libGLEW.a在/usr/lib中

libSDL2.a位于/usr/local/lib 中

它们需要在同一个目录中吗?

第2版:

更新

我更改了一些内容,现在我将GLEW构建为"/usr/local",因此所有内容都在同一目录中。

我的makefile:

#my compiler
CC=g++
#my program name
PRGNAME=booom
#library search directory
LIBDIR=-L/usr/local/lib
#library names
#uses libSDL2.a, libGLEW.a
LIBNAME=-lSDL2 -lGLEW 
#includes for libraries
INCLUDES=-I/usr/local/include
#my compiler options
CFLAGS=-c -Wall

all: main.o Display.o
    $(CC) $(LIBDIR) $(LIBNAME) -o $(PRGNAME) main.o Display.o
#main.cpp is the dependency of main.o
main.o: main.cpp
    $(CC) $(CFLAGS) $(INCLUDES) main.cpp
Display.o: Display.cpp
    $(CC) $(CFLAGS) $(INCLUDES) Display.cpp 
clean:
    rm -rf *o booom

我现在的错误:

rm -rf *o booom
g++ -c -Wall -I/usr/local/include main.cpp
g++ -c -Wall -I/usr/local/include Display.cpp 
g++ -L/usr/local/lib -lSDL2 -lGLEW  -o booom main.o Display.o
Undefined symbols for architecture x86_64:
  "_glClear", referenced from:
      Display::Clear(float, float, float, float) in Display.o
  "_glClearColor", referenced from:
      Display::Clear(float, float, float, float) in Display.o
  "_glCullFace", referenced from:
      Display::Display(int, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in Display.o
  "_glEnable", referenced from:
      Display::Display(int, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in Display.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 1

seams,比如我有一个32位版本,而我需要一个64位版本,但我已经自己构建了,我真的不知道自己做错了什么。通常你也要做一些类似的事情/在构建之前进行配置。但是没有GLEW的配置。我在谷歌上找到的唯一解决方案涉及macports,但我很想在没有macports的情况下完成