У меня есть программа, написанная на С++, с некоторыми вложенными папками, содержащими связанные библиотеки. Там находится SCS-скрипт верхнего уровня, который вызывает файлы SConscript в подпапках/библиотеках.
Внутри библиотеки cpp есть GTest:
TEST(X, just_a_passing_test) {
EXPECT_EQ(true, true);
}
В исходном программном источнике есть основной(), который просто вызывает GTests main и имеет еще один GTest:
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
TEST(Dummy, should_pass){
EXPECT_EQ(true, true);
}
Теперь проблема в том, что при запуске программы GTest запускает тест только в источнике main.cpp. Игнорирование теста в библиотеке. Теперь он становится странным, когда я ссылаюсь на несвязанный класс в той же библиотеке cpp в main.cpp, без какого-либо побочного эффекта (например, "SomeClass foo;" ), тест волшебным образом появляется. Я пробовал использовать -O0 и другие трюки, чтобы заставить gcc не оптимизировать код, который не вызывается. Я даже попробовал Клэнг. Я подозреваю, что это связано с тем, как GTest проверяет обнаружение во время компиляции, но я не могу найти никакой информации по этой проблеме. Я считаю, что он использует статическую инициализацию, поэтому, возможно, там происходит странное упорядочение. Любая помощь/информация очень ценится!
Обновление: Нашел раздел в FAQ, который звучит как эта проблема, несмотря на то, что он ссылается конкретно на Visual С++. Что включает в себя трюк/взлома, чтобы заставить компилятор не отбрасывать библиотеку, если не ссылаться. Он рекомендует не помещать тесты в библиотеки, но это заставляет меня задаться вопросом, как еще вы будете протестировать библиотеки, не имея исполняемого файла для каждого из них, быстро избавляя их от боли и с раздутым выходом. https://code.google.com/p/googletest/wiki/Primer#Important_note_for_Visual_C++_users