2013-05-18 48 views
2

我原來的問題是在下面,但它發展到以下相關的問題:是否有任何錯誤的鏈接器語句中的對象後面的鏈接器標誌?當在C++中運行鏈接步驟時,鏈接器標誌的順序是否很重要?


當我在Eclipse中構建,下面的鏈接語句運行:

g++ -fopenmp -lconfig++ -o "pc2" ./main.o ./sampling.o ./simulation.o

這是不正確的,因爲lconfig++必須遵守,而不是之前,對象文件清單。所以,我修改了makefile,這是Eclipse基於項目設置自動生成的。具體地講,我改變生成文件

# Tool invocations 
pc2: $(OBJS) $(USER_OBJS) 
    @echo 'Building target: [email protected]' 
    @echo 'Invoking: GCC C++ Linker' 
    g++ -fopenmp -lconfig++ -o "pc2" $(OBJS) $(USER_OBJS) $(LIBS) 
    @echo 'Finished building target: [email protected]' 
    @echo ' ' 

的這一部分是如下:

# Tool invocations 
pc2: $(OBJS) $(USER_OBJS) 
    @echo 'Building target: [email protected]' 
    @echo 'Invoking: GCC C++ Linker' 
    g++ -o "pc2" $(OBJS) $(USER_OBJS) $(LIBS) -fopenmp -lconfig++ 
    @echo 'Finished building target: [email protected]' 
    @echo ' ' 

然後,修改1線生成文件的,就進入後

make clean all -C release

在命令行中產生以下正確的鏈接語句:

g++ -o "pc2" ./main.o ./sampling.o ./simulation.o -fopenmp -lconfig++

因此,我知道如何解決makefile文件,使構建過程是正確的。

我在做什麼不是知道如何配置Eclipse,使其生成的makefile將鏈接器標誌(或「選項」?)放在正確的位置。

+0

發佈此問題後,我發現可以將設置>連接器>「命令行模式」中的$ {FLAGS}移至模式規範的末尾。這解決了這個問題。然而,它提出了一個問題:有什麼理由可能需要鏈接器標誌位於目標文件之前? – synaptik

回答

1

您已回答了您自己的問題:yes,鏈接行上的對象和庫的順序does matter

是否有任何理由爲什麼我可能需要鏈接器標誌先於目標文件?

有可能存在這樣的鏈接器標誌。例如,--start-group GNU-ld鏈接器選項必須(顯然)在它啓動的庫組之前。該--start-lib黃金連接選項必須(顯然)先形成一個庫中的對象,等

我發現我可以在設置移動$ {} FLAGS

你可能已經在包括-lconfig++這可能是一個錯誤 - -lconfig++而不是鏈接器標誌(即使它看起來像一個),它是一個庫規範,並且可能應該包含在${LIBS}等中。

相關問題