szymo
February 16, 2020, 12:37pm
1
I want to setup project and add possibility to test it with GoogleTest.
I’ve installed GoogleTest library in PIO Home.
I’ve created new project - Board: Arduino Uno and Framework: Arduino
I’ve created file test.cpp in test/native folder and I added:
#include "gtest/gtest.h"
I’ve added native platform to platformio.ini:
[env:uno]
platform = atmelavr
board = uno
framework = arduino
[env:native]
platform = native
I runned command: platformio.exe test --environment native. The result:
platformio.exe test --environment native <
Verbose mode can be enabled via `-v, --verbose` option
Collected 1 items
Processing native in native environment
---------------------------------------------------------------------------------------------------------------------------------
Building...
test\native\test.cpp:1:10: fatal error: gtest/gtest.h: No such file or directory
#include "gtest/gtest.h"
^~~~~~~~~~~~~~~
compilation terminated.
*** [.pio\build\native\test\native\test.o] Error 1
================================================== [FAILED] Took 2.56 seconds ==================================================
Test Environment Status Duration
------ ------------- -------- ------------
native uno IGNORED
native native FAILED 00:00:02.555
============================================= 1 failed, 0 succeeded in 00:00:02.555 =============================================
The terminal process terminated with exit code: 1
Terminal will be reused by tasks, press any key to close it.
I don’t know how to add Gtest library to compilation process. Any suggestions?
Thank You,
szymo
It seems to all be in the include paths…
I had a look at the construction of their own platformio.ini and test code, and to get this compiling, I downloaded the google test repo as a zip file, and put the googlemock and googletest directories at the root of a project (i.e. at the same level as the src and lib directories). I then configured native as
[env:native]
platform = native
build_flags = -Igoogletest/include -Igoogletest
and made a simple dumb main.cpp in test\native\
#include "gtest/gtest.h"
int main()
{
return 0;
}
which compiled/tested successfully.
I was also able to use this platformio.ini configuration, and avoid having to install the googletest suite manually… but, it’s a bit… convoluted…
[env:native]
platform = native
lib_deps = googletest
build_flags = -I$PROJECT_DIR/.pio/libdeps/$PIOENV/googletest_ID5976/googletest/include -I$PROJECT_DIR/.pio/libdeps/$PIOENV/googletest_ID5976/googletest
1 Like
szymo
February 20, 2020, 9:24pm
3
Yes, it is working - test is compiled. Thank You.
But now I have a problem with intellisense, because “#include “gtest/gtest.h”” is underlined by this one - I think that iostream and others files from c++ aren’t visible for this one. When I’m adding something to the c_cpp_properties.json it is deleted after reset of VSC. #include is also underlined. What is intresting: #include <stdio.h> isn’t underlined.
How can I add files for c++?
Hence the
at the top of the file…
You’ll probably be after the -Idir build_flags . What is IntelliSense moaning about in the ‘Problems’ tab? That may give some idea as to what stuff it’s having trouble finding.
szymo
February 24, 2020, 7:15pm
5
Yes, I’ve known that this file is generated automatically.
I don’t know how to add files like “iostream” by -Idir (build_flags). I think that these problems are because Intellisense don’t see these files - but compilation proces works great - so the compilator knows these files.
Here my “problem” tab:
Thank You @pfeerick that You are trying to help me
Is the native environment the first environment in your platformio.ini? Do you get the correct intellisense when you move it upwards?
szymo
February 24, 2020, 7:28pm
7
Native was my second environment. I just changed it to the first one and it seems that the problem is solved. It works and I don’t any problems from intellisense. I’ve never thought that it matters.
Thank You guys for Your help
1 Like
Only the first environment is used for intellisense, you can’t have both at the same time. (The result could be ambigious…)
1 Like
szymo
February 24, 2020, 7:35pm
9
Yep, you’re right. Now Intellisense for Arduino environment is broken. Thank You again.
Hello @szymo and @maxgerhardt , I have followed the steps mentioned above and reproduce the main.cpp test verbatim and I´m getting this error:
/bin/ld: .pio/build/native/test/native/main.o: in function `(anonymous namespace)::testMath_mySumTest_Test::testMath_mySumTest_Test()':
main.cpp:(.text+0x14): undefined reference to `testing::Test::Test()'
/bin/ld: .pio/build/native/test/native/main.o: in function `(anonymous namespace)::testMath_mySumTest_Test::TestBody()':
main.cpp:(.text+0xc2): undefined reference to `testing::Message::Message()'
/bin/ld: main.cpp:(.text+0xf1): undefined reference to `testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)'
/bin/ld: main.cpp:(.text+0x104): undefined reference to `testing::internal::AssertHelper::operator=(testing::Message const&) const'
/bin/ld: main.cpp:(.text+0x110): undefined reference to `testing::internal::AssertHelper::~AssertHelper()'
/bin/ld: main.cpp:(.text+0x14d): undefined reference to `testing::internal::AssertHelper::~AssertHelper()'
/bin/ld: .pio/build/native/test/native/main.o: in function `main':
main.cpp:(.text+0x1dc): undefined reference to `testing::InitGoogleTest(int*, char**)'
/bin/ld: .pio/build/native/test/native/main.o: in function `(anonymous namespace)::testMath_mySumTest_Test::~testMath_mySumTest_Test()':
main.cpp:(.text+0x20e): undefined reference to `testing::Test::~Test()'
/bin/ld: .pio/build/native/test/native/main.o: in function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x355): undefined reference to `testing::internal::GetTestTypeId()'
/bin/ld: main.cpp:(.text+0x3c3): undefined reference to `testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, testing::internal::CodeLocation, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)'
/bin/ld: .pio/build/native/test/native/main.o: in function `RUN_ALL_TESTS()':
main.cpp:(.text._Z13RUN_ALL_TESTSv[_Z13RUN_ALL_TESTSv]+0x9): undefined reference to `testing::UnitTest::GetInstance()'
/bin/ld: main.cpp:(.text._Z13RUN_ALL_TESTSv[_Z13RUN_ALL_TESTSv]+0x11): undefined reference to `testing::UnitTest::Run()'
/bin/ld: .pio/build/native/test/native/main.o: in function `testing::internal::SuiteApiResolver<testing::Test>::GetSetUpCaseOrSuite(char const*, int)':
main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci]+0x71): undefined reference to `testing::internal::IsTrue(bool)'
/bin/ld: main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci]+0x96): undefined reference to `testing::internal::GTestLog::GTestLog(testing::internal::GTestLogSeverity, char const*, int)'
/bin/ld: main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci]+0xfd): undefined reference to `testing::internal::GTestLog::~GTestLog()'
/bin/ld: main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE19GetSetUpCaseOrSuiteEPKci]+0x132): undefined reference to `testing::internal::GTestLog::~GTestLog()'
/bin/ld: .pio/build/native/test/native/main.o: in function `testing::internal::SuiteApiResolver<testing::Test>::GetTearDownCaseOrSuite(char const*, int)':
main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci]+0x71): undefined reference to `testing::internal::IsTrue(bool)'
/bin/ld: main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci]+0x96): undefined reference to `testing::internal::GTestLog::GTestLog(testing::internal::GTestLogSeverity, char const*, int)'
/bin/ld: main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci]+0xfd): undefined reference to `testing::internal::GTestLog::~GTestLog()'
/bin/ld: main.cpp:(.text._ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci[_ZN7testing8internal16SuiteApiResolverINS_4TestEE22GetTearDownCaseOrSuiteEPKci]+0x132): undefined reference to `testing::internal::GTestLog::~GTestLog()'
/bin/ld: .pio/build/native/test/native/main.o: in function `testing::AssertionResult testing::internal::CmpHelperEQ<int, int>(char const*, char const*, int const&, int const&)':
main.cpp:(.text._ZN7testing8internal11CmpHelperEQIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_[_ZN7testing8internal11CmpHelperEQIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_]+0x47): undefined reference to `testing::AssertionSuccess()'
/bin/ld: .pio/build/native/test/native/main.o: in function `testing::AssertionResult testing::internal::CmpHelperEQFailure<int, int>(char const*, char const*, int const&, int const&)':
main.cpp:(.text._ZN7testing8internal18CmpHelperEQFailureIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_[_ZN7testing8internal18CmpHelperEQFailureIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_]+0x8b): undefined reference to `testing::internal::EqFailure(char const*, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)'
/bin/ld: .pio/build/native/test/native/main.o:(.data.rel.ro+0x20): undefined reference to `testing::Test::SetUp()'
/bin/ld: .pio/build/native/test/native/main.o:(.data.rel.ro+0x28): undefined reference to `testing::Test::TearDown()'
/bin/ld: .pio/build/native/test/native/main.o:(.data.rel.ro+0x68): undefined reference to `typeinfo for testing::Test'
Any idea about why I’m getting this error? Note that with the test:
#include "gtest/gtest.h"
int main()
{
return 0;
}
I’m having no issues.
Hey @szymo @maxgerhardt @albertotejada
I’m having the same issue as @albertotejada . Headers are found but PIO does not seem to build the googletest libs alongside with the tests, hence the undefined references I guess any solution available?
Well the problem is that the googletest library has declared
so it will not be seen as a compatible library for the embedded platform with no framework.
Adding lib_compat_mode = off turns that off and it works with no hassle.
[env:native]
platform = native
lib_compat_mode = off
lib_deps =
google/googletest @ ^1.10.0
should be your platformio.ini.
See my reference project at GitHub - maxgerhardt/pio-native-gtest-example: Example for the usage of PlatformIO and the googletest library on the native platform . It compiles and executes just fine.
If you don’t want to execute the program yourself but want it to be run when using “Test”, you need to add
test_build_project_src = true ;Build from the sourde code folder
and then “Test” gives
I shared the solution to my problem in this post , check it out and see if it solves also your issue.
1 Like