2012-08-30 82 views
0

Object.hppg ++文件格式無法識別;治療Object.o作爲鏈接腳本

#ifndef OBJECT_HPP 
#define OBJECT_HPP 

#include <SFML/Graphics.hpp> 

using namespace std; 

class Object { 
    private: 
    sf::Image image; 

    public: 
    float x; 
    float y; 
    int width; 
    int height; 
    sf::Sprite sprite; 

    virtual void update(); 
}; 

#endif 

Object.cpp

void Object::update() { 

} 

這裏是我的Makefile:

LIBS=-lsfml-graphics -lsfml-window -lsfml-system 

all: 
    @echo "** Building mahgame" 

State.o : State.cpp 
    g++ -c State.cpp 

PlayState.o : PlayState.cpp 
    g++ -c PlayState.cpp 

Game.o : Game.cpp 
    g++ -c Game.cpp 

Object.o : Object.cpp 
    g++ -c Object.cpp 

Player.o : Player.cpp 
    g++ -c Player.cpp 

mahgame : Game.o State.o PlayState.o Object.o Player.o 
    g++ -o mahgame Game.o State.o PlayState.o Object.o Player.o $(LIBS) 

    #g++ -c "State.cpp" -o State.o 
    #g++ -c "PlayState.cpp" -o PlayState.o 
    #g++ -c "Game.cpp" -o Game.o 
    #g++ -c "Object.hpp" -o Object.o 
    #g++ -c "Player.hpp" -o Player.o 
    #g++ -o mahgame Game.o State.o PlayState.o Object.o Player.o $(LIBS) 

clean: 
    @echo "** Removing object files and executable..." 
    rm -f mahgame 

install: 
    @echo '** Installing...' 
    cp mahgame /usr/bin 

uninstall: 
    @echo '** Uninstalling...' 
    rm mahgame 

這裏是我得到時錯誤建設(建設後,這是一個鏈接器錯誤):

/usr/bin/ld:Object.o: file format not recognized; treating as linker script 
/usr/bin/ld:Object.o:1: syntax error 
collect2: error: ld returned 1 exit status 
make: *** [all] Error 1 

想知道發生了什麼?提前致謝。

+0

這不是一個makefile,這個例子不完整,我真的懷疑它是最小的。 – Beta

回答

0

makefile文件的格式爲:

xxx.o : xxx.cpp 
    g++ -c xxx.cpp 

此致不看這樣的事情。因此,改變你的是:

LIBS=..... 

[EDIT] 
all : mahgame rmerr 

rmerr : 
    rm -f err 
[/EDIT] 

State.o : State.cpp 
    g++ -c State.cpp 2>>err 

PlayState.o : PlayState.cpp 
    g++ -c PlayState.cpp 2>>err 

..... 

mahgame : Game.o State.o ..... 
    g++ -o mahgame Game.o State.o PlayState.o Object.o Player.o $(LIBS) 2>>err 

注意,這些是你的第一個步驟,也有寫的makefile不包括源文件/目標文件/等每一個細節的更好的方法。

+0

g ++ -o mahgame Game.o State.o PlayState.o Object.o Player.o -lsfml-graphics -lsfml-window -lsfml-system g ++:error:Game.o:No such file or directory g ++:error :State.o:No such file or directory g ++:error:PlayState.o:No such file or directory g ++:error:Object.o:No such file or directory g ++:error:Player.o:No such file或目錄 不應該是另一種方式? –

+0

發佈你的實際生成文件(注意我對我的修改順序) – KevinDTimm

+0

https://gist.github.com/174da34847370dd689eb –

0

您的Makefile看起來很完美,如果有點冗長,並且缺少頭文件依賴關係。我假設shell命令有一個前導製表符。我假設你的構建命令是make mahgame

正如你所說,你有一個鏈接錯誤。 Object.o似乎不是有效的.o。讓編譯器重新生成它。

$ rm Object.o 
$ make mahgame 
g++ -c Object.cpp 
g++ -o mahgame Game.o State.o PlayState.o Object.o Player.o... 
+0

我「rm * .o」多次重建所有內容,但我仍然得到該鏈接器錯誤。 –

+0

因此,手工編譯'Object.cpp'並查看生成的目標文件。 '$ g ++ -c Object.cpp','$ file Object.o'(我的系統顯示爲「Object.o:ELF 64位LSB可重定位,x86-64,版本1(SYSV),未被刪除」), $ objdump -f Object.o'。 – bobbogo

1

您是否有機會使用ccache? 我剛剛有一個非常類似的問題,並在編譯中省略了ccache解決了它。