Не могу собрать с помощью scons мои модульные тесты вместе с программой

Я пытаюсь создать набор тестов для своего кода с помощью scons. Все мои файлы находятся в их текущем состоянии. После попытки scons test и scons я получаю эту кучу ошибок компоновщика:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
clang++ -o test main.o simplest_test.o fixture_test.o -lcppunit
fixture_test.o: In function `FixtureTest::Test1()':
fixture_test.cpp:(.text+0xd7): undefined reference to `MyTestClass::ThrowException() const'
fixture_test.o: In function `FixtureTest::~FixtureTest()':
fixture_test.cpp:(.text._ZN11FixtureTestD2Ev[_ZN11FixtureTestD2Ev]+0x14): undefined reference to `MyTestClass::~MyTestClass()'
fixture_test.o: In function `FixtureTest::~FixtureTest()':
fixture_test.cpp:(.text._ZN11FixtureTestD0Ev[_ZN11FixtureTestD0Ev]+0x14): undefined reference to `MyTestClass::~MyTestClass()'
fixture_test.o: In function `CppUnit::ConcretTestFixtureFactory<FixtureTest>::makeFixture()':
fixture_test.cpp:(.text._ZN7CppUnit25ConcretTestFixtureFactoryI11FixtureTestE11makeFixtureEv[_ZN7CppUnit25ConcretTestFixtureFactoryI11FixtureTestE11makeFixtureEv]+0x2f): undefined reference to `MyTestClass::MyTestClass()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
scons: *** [test] Error 1
scons: building terminated because of errors.

Что случилось?

Обновление (добавлен сюда файл SConstruct)

env = Environment( CXX="clang++" )

flags = [
    "-std=c++11",
    "-Wall",
    "-O3",
]

libs = [ "-lcppunit" ]

test_sources = [
    "main.cpp",
    "simplest_test.cpp",
    "fixture_test.cpp",
]

main_sources = [
    "MyTestClass.cpp",
]

env.Program( target="program", source=main_sources, CXXFLAGS=flags, LIBS=libs )
program = env.Program( target="test", source=test_sources, CXXFLAGS=flags, LIBS=libs )
test_alias = Alias( "test", [program], program[0].path )

AlwaysBuild( test_alias )

person Roger Afferson    schedule 09.03.2016    source источник
comment
Со сконами проблем нет. У вас будет такая же ошибка, если вы используете напрямую clang++. Проверьте, где реализованы ThrowException, а также конструктор и деструктор MyTestClass, и убедитесь, что файл, содержащий реализацию, скомпилирован и связан с другими   -  person Garf365    schedule 09.03.2016
comment
Увидев ваш код, он явно пропустил MyTestClass.cpp в процессе компиляции. Может быть, указав здесь свой SConstruct, вы сможете получить правильный ответ   -  person Garf365    schedule 09.03.2016
comment
Попробуйте это: program = env.Program( target="test", source=test_sources+main_sources, CXXFLAGS=flags, LIBS=libs )   -  person Garf365    schedule 09.03.2016
comment
@Garf365 Garf365 спасибо, теперь все работает, но у меня есть предупреждение: warning: Two different environments were specified for target MyTestClass.o. И можете ли вы дать реальный ответ, чтобы я мог его принять.   -  person Roger Afferson    schedule 09.03.2016


Ответы (1)


Измените на следующее, и ваше предупреждение должно исчезнуть.

#LIBS should be the lib name and not the flag so
libs=['cppunit']

# Only specify the main_source to be compiled once
# in the original both Program statements were effectively requesting the object to be built, and likely that caused your warning.
main_source_objects = env.SharedObject(main_sources)

program = env.Program( target="test", source=test_sources+main_source_objects, CXXFLAGS=flags, LIBS=libs )

Это должно делать свое дело.

person bdbaddog    schedule 10.03.2016