2014-03-25 38 views
0

我有幾個文件夾項目:C++生成文件:只使用一些頭文件在include目錄

folderA: header1.h header2.h 
folderB: header1.h(modified) file1.cpp (includes header1.h and header2.h) 

我想寫使用來自folderBheader1.hheader2.hfolderA一個Makefile。

但如果我寫我的Makefile是這樣的:在編譯說some values are defined twice,即使頭文件開始#pragma once

LOCAL_C_INCLUDES += \ 
folderA\ 

然後,我有錯誤。

任何想法如何實現?

我也試過明確列出makefile中的頭文件,但它似乎不工作。

+0

如果你的編譯器支持'#pragma once'頭文件不應該包含兩次,我不認爲這是makefile的原因,你檢查你的源代碼嗎? –

+0

哪個工具鏈適用於:gcc或MS?是修改來源選項?如果是這樣,您可以忽略本地包含,只需將源文件更改爲#include「文件夾A/header2.h」或「文件夾B/header1.h」即可。 – cup

+1

你可以嘗試#include「../FolderA/header2.h」(並刪除makefile中的包含)! – paykoob

回答

0

關於包含文件,我傾向於使用-Ipath/to /文件夾到每個包含includes的文件夾。所以在這種情況下,這將是-Ipath/to/folderA -Ipath/folderB,然後您可以在代碼中編寫#include「header1.h」#include「header2.h」。

包括警衛(#ifndef和#pragma)在跨編譯單元不起作用,這就是爲什麼你永遠永遠不會永遠(嚴重,它只會導致你長期痛苦)定義標題中的任何內容文件,只聲明它們。

這將擺脫多重定義問題。爲什麼?

編譯單元是一個.cpp文件和所有包含的頭文件。每個.cpp創建一個包含代碼的中間階段二進制表示的對象文件,這是編譯階段。這些目標文件然後在鏈接階段鏈接在一起。由於每個.cpp都是用C++單獨處理的,如果你有「float foo;」在header.hpp中,a.cp​​p和b.cpp都包含header.hpp,編譯器在運行應用程序時如何知道你的意思?

+0

感謝每一位已經回答的人。我正在編譯Android AOSP,我猜工具鏈是gcc?我也在考慮#include folderB/Header1.h #include folderA/Header2.h解決方案。至於dutt的回答,我很抱歉,但我不明白你的答案與我最初在我的makefile中做了什麼不同,這意味着使用包含文件所在的路徑來傳播文件。但用這種方法,我確實在編譯時得到了有關重複定義的錯誤。 – Alex