2016-06-10 98 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說明符重新安裝這些軟件包。