gtest установлен с conan: неопределенная ссылка на `testing::internal::GetBoolAssertionFailureMessage`

Я использую cmake для сборки своего проекта и conan для установки Google Test как зависимости:

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})

Тест /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
}

строить

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

я могу использовать ASSERT_STREQ, но если я использую EXPECT_FALSE Я получаю неожиданную ошибку:

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

Что не так с моей конфигурацией?

2 ответа

Решение

Проблема заключается в том, что вы устанавливаете зависимости conan, используя настройки по умолчанию (тип сборки Release):

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

Настройки по умолчанию можно увидеть в вашем conan.conf файл

Затем вы используете cmake в системе nix с типом сборки по умолчанию, который является Debug, который является средой с одним conf (в отличие от сред с несколькими конфигурациями Debug/Release, как Visual Studio), поэтому, когда вы делаете:

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

Несовместимость сборки Debug/Release приводит к этой нерешенной проблеме. Таким образом, решение будет использовать тот же тип сборки, который соответствует вашим установленным зависимостям:

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

Если вы используете мультиконфигурационные среды, такие как Visual Studio, правильный путь будет следующим:

$ cmake .. && cmake --build . --config Release

Со своей стороны, я получаю эту проблему, потому что на Redhat 7, а затем со старой libstdС++. Слишком стар для бинарных файлов/библиотек пакетов conan по умолчанию.

Я исправил это, перестроив gtest с аргументом --build gtest.

Другие вопросы по тегам