2015-05-02 147 views
0

我已經基於模板創建了一個庫。我想提供一個我的圖書館用戶可以包含的文件。因爲它是一個模板庫,我認爲庫文件需要是一個.h文件。所以要創建我包含我的所有其他模板頭文件(與聲明和定義),然後編譯與g ++ -E(只是預處理)。這個想法一直工作,直到使用該庫的人使用我在庫中使用的標準頭文件(如字符串)或庫(如boost)。由於預處理,所有在String中的定義都被複制到庫文件中。如果用戶也使用字符串,編譯器會拋出一個雙重定義錯誤,因爲它在我的庫和頭文件中定義。創建模板庫文件

那麼我該如何解決我的問題?是否有另一種生成我的庫文件的方式?或者,我是否可以阻止包含頭文件,並只爲我的文件插入include語句,而這些文件是在用戶編譯時處理的?

謝謝 DevWurm

+0

你在做什麼毫無意義可言。您不要預處理標題以嘗試使其處於獨立狀態。您將頭文件編碼爲標準符合,並讓客戶端(用戶代碼)提供您的庫消耗的符合性實現。你的模板頭*是你的庫文件。通過預處理器去除依賴關係會導致依賴於平臺的代碼和其他許多問題。是否有一些特殊的原因,你*不*將*模板庫封裝在*命名空間*中? – WhozCraig

+0

@WhozCraig是的,我看到了...所以我應該提供一個包含所有源文件和庫文件的整個文件夾,而不是像我想的那樣只提供一個庫文件?你爲什麼認爲我沒有將它封裝到命名空間中?我這樣做? – DevWurm

+0

如果您有多個用戶定義的標題,那麼它們應該是您的發行版的一部分。你如何設置它取決於你,但我可能會把它們保存在'yourlibname'文件夾中,確保客戶端包含文件夾*,**文件夾*位於其包含路徑,*和*代碼中*你的頭文件*和他們的*到'#include「yourlibname/header.h」'這可能對你正在嘗試做的事情有點公然,但我不知道你的庫結構;你是。這是一個類似於'boost'佈局的設置。但我可以告訴你,嘗試預處理解決方案不是正確的路徑。 – WhozCraig

回答

1

你不應該做預處理;您應該在使用標題進行編譯時將其留給最終用戶的計算機。所有的預處理工作都將與您的系統相匹配,如果這樣做會中斷,例如,系統特定的預處理(#if defined (__APPLE__))或限制(32位int)。也應該由他們來擁有標準庫的副本,並且他們可能需要與您的實現不同的實現。它也減少了代碼膨脹。看看這個片段的boost CRC header的,例如,它提供了一個模板CRC功能:

#ifndef BOOST_CRC_HPP 
#define BOOST_CRC_HPP 

#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT, etc. 
#include <boost/integer.hpp> // for boost::uint_t 

#include <climits> // for CHAR_BIT, etc. 
#include <cstddef> // for std::size_t 

#include <boost/limits.hpp> // for std::numeric_limits 
+0

是的,這是有道理的。我的問題是,我已經在許多文件中分割了我的圖書館以保持生存。所以現在我需要用我的所有代碼創建一個單獨的文件,以便我的lib的用戶可以使用它。你能否想到實現這個方法,而不是手動拷貝一個文件中的所有內容?還是通常提供一個包含文件的整個文件夾,並告訴用戶包含一個文件,該文件位於文件夾中,其中包含所有包含語句? – DevWurm

+0

通常,您會提供給他們一個包含所有您需要的標題的文件夾,以及包含所有其他所需標題的一個或兩個「主」標題。 – sabreitweiser

+0

非常感謝,這是一個非常有建設性的回答:) – DevWurm