GTest установлен с Conan: неопределенная ссылка

Я попытался использовать gtest, установленный через conan, но в итоге получил ошибку компоновщика ссылки undefined. Этот вопрос является более или менее продолжением этот вопрос о переполнении стека. Но я думаю, что приведенный пример был слишком простым. Я компилирую под последнюю версию Arch Linux x64, используя gcc 6.3.

Возможно ли несовпадение версий C ++? Или у вас есть другие идеи, как решить эту проблему?

Я предоставлю свой исходный код в следующем виде:

Дерево каталогов:

tree
.
├── CMakeLists.txt
├── conanfile.txt
└── main.cpp

main.cpp:

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

class TestFixture : public ::testing::Test {
protected:
    void SetUp(){
    std::cout << "SetUp()" << std::endl;
    }

    void TearDown(){
    std::cout << "TearDown()" << std::endl;
    }
};



TEST_F (TestFixture, shouldCompile) {
    std::cout << "shouldCompile" << std::endl;
    ASSERT_TRUE(true); // works, maybe optimized out?
    ASSERT_TRUE("hi" == "hallo"); // undefined reference

}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

CMakeLists.txt:

project(ConanGtestExample)
cmake_minimum_required(VERSION 2.8.12)

set(CMAKE_CXX_STANDARD 11)

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

# Necessary to compile gtest
# - dependencies and final build
#   need to be compiled with same
#   build type. Otherwise linker
#   error will occure.
set(CMAKE_BUILD_TYPE Release)

add_executable(main main.cpp)
target_link_libraries(main ${CONAN_LIBS})

Файл conanfile.txt:

[requires]
gtest/1.7.0@lasote/stable

[generators]
cmake

Я попытался собрать проект с помощью следующих команд:

mkdir build
cd build
conan install -s build_type=Release .. --build=missing
cmake .. -DCMAKE_BUILD_TYPE=Release 
cmake --build .

Неопределенный выход ссылки:

Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable bin/main
CMakeFiles/main.dir/main.cpp.o: In function `TestFixture_shouldCompile_Test::TestBody()':
main.cpp:(.text+0x99): undefined reference to `testing::internal::GetBoolAssertionFailureMessage[abi:cxx11](testing::AssertionResult const&, char const*, char const*, char const*)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:95: bin/main] Error 1
make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

person erikzenker    schedule 10.02.2017    source источник


Ответы (2)


Я нашел ответ на свой вопрос:

Проблема в том, что conan по умолчанию загружает / компилирует двоичные файлы gtest с libstdc++, даже если мой компилятор (gcc 6.3) по умолчанию использует libstdc++11. Таким образом, существует несоответствие между libstdc++ и libstdc++11.

Чтобы обойти эту проблему, вы должны явно указать conan для компиляции с libstdc ++ 11:

conan install .. --build missing -s compiler=gcc -s compiler.version=6.3 -s compiler.libcxx=libstdc++11
person erikzenker    schedule 10.02.2017
comment
Я собирался ответить, ты был быстрее на секунды! Дело в том, что conan использует значение по умолчанию libstdc++, вы можете проверить его в своем <home>/.conan/conan.conf, потому что это тот, который обеспечивает более широкую совместимость. Возможно, вы захотите прочитать blog.conan.io/2016/03/22/. TL; DR: с libstdc++ вы можете создавать бины, которые работают в большинстве дистрибутивов, даже в старых, даже в gcc ›5.1, они идут с libstdc ++ (не 11) - person drodri; 10.02.2017
comment
вы также можете изменить это в профиле. Вы можете найти профили в ~/.conan/profiles, вы можете либо создать новый, либо обновить профиль по умолчанию. мне нужно было ключевое значение: compiler.libcxx=libstdc++11. - person Oguzcan; 20.09.2020

В итоге мне пришлось добавить self.options['gtest'].shared = True в conanfile.py проекта, чтобы обойти это. Раньше для него было установлено значение false по некоторым причинам, связанным с Windows, которые стали неактуальными.

Попробуйте перейти на общие библиотеки для gtest / gmock, если вы, как и я, заметили, что настройки по умолчанию уже libstdc++11, поэтому изменения conan install аргументов было недостаточно.

person peter karasev    schedule 29.03.2018
comment
В моем случае настройка self.options['gtest'].shared = True тоже сработала. Раньше я также настраивал self.options['gtest'].shared == False, и GCC терпит неудачу для некоторых проектов (ТОЛЬКО некоторые проекты, которые я считаю, что я настроил так же, как другие успешные проекты!), В то время как MSVC и Clang не имеют таких проблем. - person Tomoyuki Aota; 27.07.2018