2016-06-10 96 views
0

我正在用Cpp + x86程序集编写混合程序。该项目由3个文件组成:main.cc,data.cc和a_t.asm。我坚持使用makefile(我是一个初学者)的一部分。它看起来像这样:无法在makefile中链接opengl库

CC=gcc 
ASMBIN=nasm 
CFLAGS=-m32 -Wall 

all: main.o a_t.o 
    $(CC) -m32 main.o a_t.o -lGL -lGLU -lglut 

a_t.o: 
    $(ASMBIN) -f elf a_t.asm 

main.o: main.cc data.cc 
    $(CC) $(CFLAGS) -g main.cc 

clean: 
    rm -rf *o main 

在make命令我得到如下:

gcc -m32 main.o a_t.o -lGL -lGLU -lglut 
/usr/bin/ld: cannot find -lGL 
/usr/bin/ld: cannot find -lGLU 
/usr/bin/ld: cannot find -lglut 
collect2: error: ld returned 1 exit status 
make: *** [all] Error 1 

我试图把“-lGL -lGLU -lglut”部分以不同的顺序,但没有工作过。我安装了所有三个库并正在工作。 我将不胜感激您的帮助。

+2

你的代码是否真的使用这些库中的函数?在我看来,你只需要安装运行时库,而不是头文件和链接库。你的makefile没有问题。 –

+0

是的,它的确如此。看起来当我添加-m32标志时,它停止正常工作。 –

+0

那意味着你没有安装32位库。 –

回答

0

Makefiles可能有点神秘,有点挑剔,并且有很多关于如何写它们的巫术。这里是一个更合理的,固定的makefile:

# Don't set CC=gcc, because it's not 1995 any more. 
ASMBIN = nasm 
# CFLAGS is for C, CXXFLAGS is for C++ 
# Also, let's put -g here 
CXXFLAGS = -m32 -Wall -g 
LDFLAGS = -m32 

# Use pkg-config wherever possible 
opengl_libs := -lglut $(shell pkg-config --libs gl glu) 
opengl_cflags := $(shell pkg-config --cflags gl glu) 

all: main 

main: main.o a_t.o 
    # Order of flags is important here! 
    # We also have to use CXX instead of CC to avoid linker errors. 
    $(CXX) $(LDFLAGS) -o [email protected] $^ $(opengl_libs) 

a_t.o: 
    $(ASMBIN) -f elf a_t.asm 

main.o: main.cc data.cc 
    # Don't forget -c and -o 
    $(CXX) $(CXXFLAGS) $(opengl_cflags) -c $< -o [email protected] 

clean: 
    # Should be *.o, not *o 
    rm -rf *.o main 

.PHONY: all clean 

但是,这可能不会解决您遇到的错误。您需要记住安装OpenGL库的开发版本。在基于Debian的系统,这将意味着在安装以下软件包(i386的,当然):

  • libglu1-mesa-dev
  • libgl1-mesa-dev
  • freeglut3-dev

pkg-config程序可能已经安装。

+0

谢谢你的广泛答复。不幸的是,这个问题仍然存在。我已经安装了指定的所有库,并对其进行了检查。另外,我发现,只有当我使用-m32标志时,它才会失败,这是我无法避免使用的。 –

+0

@GregoryZaika:你是否专门安装了i386版本的软件包?这听起来像你没有... –

+0

我的,我完全忽略了关于i386的括号中的那一部分。我的不好,可能早得早。 –

0

所以问题是使用-m32标志需要32位库。作为我非常感激的人,谁回答了我的建议,我应该安装这些库,只有它们的32位版本。

libglu1-mesa-dev:i386 
libgl1-mesa-dev:i386 
freeglut3-dev:i386 

对于那些谁可以使用这个答案,请记住,安装i386的包,删除AMD64,反之亦然。所以不要忘记用:amd64说明符重新安装这些软件包。