gtest установлен с conan: undefined ссылка на `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})

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
}

Сборка

$ 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

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


person maiermic    schedule 31.12.2016    source источник
comment
В какой ОС и какой компилятор (с версией) вы работаете? Содержимое conaninfo.txt и CONAN_LIBS также может быть полезно.   -  person drodri    schedule 31.12.2016
comment
Это могло быть libcxx несоответствие, из вывода ошибки кажется, что вы должны использовать libcxx=libstdc++11. Если в linux (как правило, а не в среде с несколькими конфигурациями), вы должны использовать cmake .. -DCMAKE_BUILD_TYPE=Release, предполагая, что при установке conan использовалась настройка по умолчанию -s build_type=Release   -  person drodri    schedule 31.12.2016
comment
Большое спасибо, -DCMAKE_BUILD_TYPE=Release устраняет эту проблему.   -  person maiermic    schedule 31.12.2016
comment
Хороший! Добавляя это как ответ, тогда   -  person drodri    schedule 31.12.2016


Ответы (1)


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

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

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

Затем вы используете cmake в системе nix с типом сборки по умолчанию, который является Debug, который является средой с одной конфигурацией (в отличие от сред отладки / выпуска с несколькими конфигурациями, как 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
person drodri    schedule 31.12.2016
comment
Спасибо за ваш ответ, он также работает для меня в конкретном примере @maiermic, но использование разных утверждений по-прежнему показывает мне неопределенную ссылку (например, ASSERT_TRUE("hi" == "hallo");). Вы также пробовали разные типы утверждений? - person erikzenker; 06.02.2017
comment
Это странно, одно утверждение работает, а другое нет. Возможно, заслуживает отдельного вопроса с подробным выводом и файлами, или, может быть, отправка проблемы в репозиторий автора пакета: github.com / lasote / conan-gtest (если это тот пакет, который вы используете) - person drodri; 07.02.2017
comment
Я начал следующий вопрос: stackoverflow.com/ questions / 42162014 /, а также открыл проблему с репозиторием lasote github. ru / lasote / conan-gtest / issues / 20 - person erikzenker; 10.02.2017
comment
Это помогло мне сузить проблему, спасибо. Другой вариант - изменить build_type=Debug в ~/.conan/profiles/default; вам может потребоваться полностью стереть папку data и ваш build каталог. - person Marco Massenzio; 16.03.2020