【问题标题】:makefile: no executable createdmakefile:没有创建可执行文件
【发布时间】:2015-03-02 04:41:03
【问题描述】:

我之前使用过带有 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 文件,但我没有得到一个可执行文件。

当我执行“make clean && make”时,这是我的输出:

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++ macos makefile g++


【解决方案1】:

问题在于您在所有阶段使用的-c 标志。 这意味着编译一个目标文件而不是链接。 为您的 all 目标删除它。喜欢:

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

这解决了链接问题。 现在确保您指定的文件夹中有 libSDL。

【讨论】:

    【解决方案2】:

    新版本:

    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.a

    libGLEW.a 在 /usr/lib

    libSDL2.a 位于 /usr/local/lib

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

    编辑2:

    更新

    我改变了一些东西,我现在将 GLEW 构建到“/usr/local”中,所以一切都在同一个目录中。

    我的生成文件:

    #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
    

    好像我有一个 32 位版本,而我需要一个 64 位版本,但我自己构建了它,我真的不知道我做错了什么。通常,您还必须在构建之前执行 ./config 之类的操作。但是 GLEW 没有配置。我在 google 上找到的唯一解决方案涉及 macports,但我很乐意在没有 macports 的情况下这样做

    【讨论】:

    • 正如我所写,您确定您已安装libSDL 并且可以在您的库路径中找到它吗?
    • 是的,libSDL2 在 /usr/local/lib 中。这是默认路径,它应该在哪里,由 osx 的 sdl2 makefile 定义。它需要在/usr/lib 中吗?我虽然我可以做“-L/usr/lib -L/usr/local/lib”来使用两者
    • 那应该是-lSDL2而不是-lSDL
    • 那么现在你有ld: library not found for -lSDL2 消息了吗?
    • 我在将 -lSDL 更改为 -lSDL2 后得到了这个:“找不到 -lGLEW 的库”接缝,就像他现在可以找到 -lSDL2 一样
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多