2013-02-06 25 views
3

我想使用Boost.Test進行測試驅動開發。Scons和Boost.Test,我的測試項目無法鏈接到我的主項目對象文件

我問scons創建兩個可執行文件,主文件和測試文件。 我所有的主要的項目文件都在./src/,和我所有的測試專用文件都在./test/

的問題是:

  • 主體工程目標文件被放在./build/src/
  • 測試項目的目標文件被放在./build/test/

,並在這樣的配置,因爲所有主要的項目目標文件(對我執行我的測試類)我的可執行測試無法鏈接不在同一個目錄中。

你有一個想法,我可以調整我的scons文件,以便可執行文件的鏈接Test可以使用./src./中的目標文件嗎?

下面是我的main.scons文件:

import os 
env=Environment(CPPPATH=['/usr/local/boost/boost_1_52_0/boost/','./src/'], 
       CPPDEFINES=[], 
       LIBPATH=['/usr/local/boost/boost_1_52_0/boost/libs/','.'], 
       LIBS=['boost_regex'], 
       CXXFLAGS="-std=c++0x") 
env['ENV']['TERM'] = os.environ['TERM'] 
env.Program('Main', Glob('src/*.cpp')) 

# 
testEnv = env.Clone() 
testEnv['CPPPATH'].append('./test/') 
testEnv['LIBS'].append('boost_unit_test_framework') 
testEnv.Program('Test', Glob('test/*.cpp')) 

回答

1

雖然「重複對象名單」的做法對於簡單的項目來說很好,你可能遇到一些限制,你的測試代碼不需要鏈接到主程序的整個對象空間。例如,將不是特定單元測試焦點的數據庫層劃掉。

作爲一種替代方法,您可以創建(靜態)通用代碼庫,並鏈接到主可執行文件和測試框架。

common_sources = ['src/foo.cpp', 'src/bar.cpp'] # or use Glob and then filter 
env.Library("common", common_sources) 
program_sources = ['src/main.cpp'] 
env.Program("my_program", program_sources, LIBS=['common']) 
... 
testEnv['LIBPATH'] = ['.'] # or wherever you build the library 
testEnv.Program("unit_test", test_sources, LIBS=['common']) 

這也避免了重複main()問題,你提到因爲只有program_sourcestest_sources名單應包含主程序相應的文件。

+0

我現在不會去測試你的解決方案,因爲我想編寫代碼,而且我現在可以運行一些東西。但是你的解決方案似乎完全解決了我的問題,所以我檢查你的答案。 –

0

我繼續搜索,發現This post on the web這吸引了我,使用scons的env.Object。事實上,這個對象包含所有目標對象文件的列表。

並稍作修改我有scons的文件,做我想要的東西(雖然我現在有dupplicated主要功能的問題,但這是另一個問題):

import os 

env=Environment(CPPPATH=['/usr/local/boost/boost_1_52_0/boost/','./src/'], 
       CPPDEFINES=[], 
       LIBPATH=['/usr/local/boost/boost_1_52_0/boost/libs/','.'], 
       LIBS=['boost_regex'], 
       CXXFLAGS="-std=c++0x") 
env['ENV']['TERM'] = os.environ['TERM'] 

# here I keep track of the main project object files 
mainObjectFiles = env.Object(Glob('src/*.cpp')) 

env.Program('PostgresCpp', mainObjectFiles) 

# 
testEnv = env.Clone() 
testEnv['CPPPATH'].append('./test/') 
testEnv['LIBS'].append('boost_unit_test_framework') 

# here I append all needed object files 
testObjectFiles = Glob('test/*.cpp') 
testedObjectFiles = Glob('src/*.cpp') 
allObjectFilesExceptMain = [x for x in mainObjectFiles if x != 'src/main.o'] 
allObjectFilesExceptMain.append(testObjectFiles) 

testEnv.Program('Test',allObjectFiles) 
相關問題