Scons и Boost.Test, мой тестовый проект не может связываться с моими основными объектными файлами проекта

Я хотел бы использовать 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'))

3

Решение

Хотя подход «двойные списки объектов» подходит для простых проектов, вы можете столкнуться с ограничениями, в которых ваш тестовый код не должен ссылаться на все пространство объектов вашей основной программы. Например, чтобы заглушить слой базы данных, который не является целью конкретного модульного теста.

В качестве альтернативы вы можете создавать (статические) библиотеки общего кода, которые вы связываете с вашим основным исполняемым файлом и вашей тестовой средой.

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_sources а также test_sources Списки должны содержать соответствующий файл с основной процедурой.

1

Другие решения

Я продолжил поиски и нашел Этот пост в сети что заинтриговало меня, используя scons env.Object, Действительно, этот объект содержит список всех целевых объектных файлов.

И с небольшими изменениями у меня есть файл 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']

# 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)
0

По вопросам рекламы [email protected]