gtest installed with conan: undefined reference to `testing::internal::GetBoolAssertionFailureMessage`
Asked Answered
R

2

3

I use cmake to build my project and conan to install Google Test as dependency:

conanfile.txt

[requires]
gtest/1.7.0@lasote/stable

[generators]
cmake

[imports]
bin, *.dll -> ./build/bin
lib, *.dylib* -> ./build/bin

CMakeLists.txt

PROJECT(MyTestingExample)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

INCLUDE(conanbuildinfo.cmake)
CONAN_BASIC_SETUP()

ADD_EXECUTABLE(my_test test/my_test.cpp)
TARGET_LINK_LIBRARIES(my_test ${CONAN_LIBS})

test/my_test.cpp

#include <gtest/gtest.h>
#include <string>

TEST(MyTest, foobar) {
    std::string foo("foobar");
    std::string bar("foobar");
    ASSERT_STREQ(foo.c_str(), bar.c_str()); // working
    EXPECT_FALSE(false); // error
}

Build

$ conan install --build=missing
$ mkdir build && cd build
$ cmake .. && cmake --build .

I can use ASSERT_STREQ, but if I use EXPECT_FALSE I get an unexpected error:

my_test.cpp:(.text+0x1e1): undefined reference to `testing::internal::GetBoolAssertionFailureMessage[abi:cxx11](testing::AssertionResult const&, char const*, char const*, char const*)'
collect2: error: ld returned 1 exit status

What's wrong with my configuration?

Roehm answered 31/12, 2016 at 12:16 Comment(4)
In which OS and compiler (with version) are you running? The conaninfo.txt and CONAN_LIBS content might be useful too.Thomsen
It could be a libcxx mismatch, from the error output it seems that you should be using libcxx=libstdc++11. If in linux (in general, not multi-configuration envs), you should use cmake .. -DCMAKE_BUILD_TYPE=Release, assuming that the conan install used the default setting -s build_type=ReleaseThomsen
Thank you very much, -DCMAKE_BUILD_TYPE=Release fixes this issue.Roehm
Good! Adding it as an answer thenThomsen
T
6

The issue is that you are installing conan dependencies using the default settings (which is build type Release):

$ conan install --build=missing
# equivalent to
$ conan install -s build_type=Release ... --build=missing

The default settings can be seen in your conan.conf file

Then, you are using cmake in a nix system with the default build type which is Debug, which is a single-conf environment (opposed to multi-configuration Debug/Release environments, as Visual Studio), so when you are doing:

$ cmake .. && cmake --build .
# equivalent to
$ cmake .. -DCMAKE_BUILD_TYPE=Debug && cmake --build .

The incompatibility of Debug/Release build leads to that unresolved issue. So the solution would be to use the same build type that matches your installed dependencies:

$ cmake .. -DCMAKE_BUILD_TYPE=Release && cmake --build .

If using multi-configuration environments like Visual Studio, the correct way would be:

$ cmake .. && cmake --build . --config Release
Thomsen answered 31/12, 2016 at 14:55 Comment(4)
Thank you for your answer, it also works for me for the particular example of @Roehm but using different asserts still shows undefined reference to me (eg. ASSERT_TRUE("hi" == "hallo");). Did you also tried different assert types?Wismar
This is weird, one assertion working but not the other. Maybe deserves its own question with detailed output and files, or maybe submitting issue to the package author repo: github.com/lasote/conan-gtest (if it is the package you are using)Thomsen
I started a follow up question #42162514 and also opened an issue on the repo of lasote github.com/lasote/conan-gtest/issues/20Wismar
This helped me to narrow down the issue, thanks. Another option is to change build_type=Debug in ~/.conan/profiles/default; you may need to completely wipe the data folder and your build directory too.Phenology
W
1

On my side, I get this issue because being on Redhat 7 then with an old libstdc++. Too old for conan default packages binaries/libraries.

I have fixed that by rebuilding gtest with '--build gtest' arg.

Watershed answered 13/12, 2022 at 14:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.