2015-07-23 2 views
0

Я пытаюсь сделать testbench для своей программы, используя gmock/gtest; Linux/Ubuntu; KDevelop/CMake. Из сообщения об ошибке ссылки я заключаю, что часть пакета gtest отсутствует поддержка pthread.cmake не считает -pthread

/home/projects/cpp/gmock/gtest/libgtest.a(gtest-all.cc.o): In function `testing::internal::ThreadLocal<testing::TestPartResultReporterInterface*>::~ThreadLocal()': 
gtest-all.cc:(.text._ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED2Ev[_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED5Ev]+0x16): undefined reference to `pthread_getspecific' 
gtest-all.cc:(.text._ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED2Ev[_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED5Ev]+0x2b): undefined reference to `pthread_key_delete' 

Я также прочитал

googletest: how to setup?

Использование г ++ непосредственно, все работает. Итак, поскольку я использую KDevelop/CMake, я подозреваю, что либо мой код, либо CMake.

В моей CMakeLists.txt я использую

add_definitions(-pthread -m64) 

Однако, я не вижу никакого эффекта в Makefile. Я что-то упустил из своего CMakeLists.txt, или CMake не считает строку выше?

Мои CMakeLists.txt

cmake_minimum_required(VERSION 2.8) 
add_definitions(-Dpthread) 

project(ThreadTest) 

INCLUDE_DIRECTORIES(gmock/gtest/include) 

set (GTEST_LIBS libgtest.a) 
link_directories(~/projects/cpp/gmock/gtest) 

add_executable(ThreadTest main_test.cpp) 
target_link_libraries(ThreadTest ${GTEST_LIBS}) 

ли я неправильно понять, что add_definitions должен работать в этой ситуации?

После прочтения How do I force cmake to include "-pthread" option during compilation? мой вопрос действительно выглядит как дубликат. Тем не менее,

cmake_minimum_required(VERSION 2.8) 
add_definitions(-Dpthread) 

project(ThreadTest) 

INCLUDE_DIRECTORIES(gmock/gtest/include) 

find_package(Threads) 
set (GTEST_LIBS libgtest.a) 
link_directories(~/projects/cpp/gmock/gtest) 

add_executable(ThreadTest main_test.cpp) 
target_link_libraries(ThreadTest ${GTEST_LIBS} ${CMAKE_THREAD_LIBS_INIT}) 

все еще дает предупреждение «Не удалось найти темы». Я попытался найти программный центр Ubuntu для «потоков», без результата. После этого я установил libghc-threads-dev. Однако при использовании

set(CMAKE_THREAD_PREFER_PTHREAD TRUE) 
find_package(Threads REQUIRED) 

Я продолжаю получать «Не удалось найти темы», как ошибку. Что мне делать, чтобы удовлетворить find_package, и почему у меня возникает эта проблема, когда простой Makefile создает то, что я ожидаю?

PS: мой главный файл:

#include "gmock/gtest/include/gtest/gtest.h" 

TEST(blahTest, blah1) { 
    EXPECT_EQ(1, 1); 
} 

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

    int returnValue; 

    returnValue = RUN_ALL_TESTS(); 

    return returnValue; 
} 
+1

Возможный дубликат для http://stackoverflow.com/questions/5 395309/cmake-and-threads –

+0

для CMake add link_libraries (pthread) –

ответ

1

I интегрированной основы тестирования Google в своем собственном проекте, и этот файл CMake работает.

# Google C++ Testing Framework 
# https://code.google.com/p/googletest/ 
find_package(GTest REQUIRED) 
include_directories(${GTEST_INCLUDE_DIRS}) 

if(WIN32) 
    # GTest is static compiled by default 
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") 
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 
endif() 

enable_testing() 
add_executable(ThreadTest main_test.cpp) 
target_link_libraries(ThreadTest ${GTEST_BOTH_LIBRARIES}) 

предупреждение CMake "Не удалось найти Threads" связано с ошибкой: CMake failing to detect pthreads due to warnings

+0

Hm. Моя система продолжает говорить: make -j2 Ошибка CMake в /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (сообщение): Не удалось найти GTest (отсутствует: GTEST_LIBRARY GTEST_MAIN_LIBRARY) (установлен libgtest-dev) – katang

+0

Здесь вам что-то поможет: http://stackoverflow.com/a/13513907/5037799 –

+0

Спасибо за подсказку, я не знал, До сих пор, я догадался, это всего лишь часть gmock. Согласно этому источнику «Но gmock отсутствует». Во всяком случае, я попробую это позже. – katang

1

После ЧНН, мне удалось собрать мою сверхсложных тестовую программу, используя KDevelop/CMake/GTEST

#include "gtest-1.7.0/include/gtest/gtest.h" 

TEST(blahTest, blah1) { 
    EXPECT_EQ(1, 1); 
} 

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

    return RUN_ALL_TESTS(); 
} 

CMakeLists.txt файл, который мог бы сделать задачу является

# http://stackoverflow.com/questions/13513905/how-to-properly-setup-googletest-on-linux/13513907#13513907 
# http://stackoverflow.com/questions/15193785/how-to-get-cmake-to-recognize-pthread-on-ubuntu 
# http://stackoverflow.com/questions/21116622/undefined-reference-to-pthread-key-create-linker-error 
# http://stackoverflow.com/questions/1620918/cmake-and-libpthread 
# https://meekrosoft.wordpress.com/2009/10/04/testing-c-code-with-the-googletest-framework/ 
# http://stackoverflow.com/questions/30106608/googletest-cmake-and-make-tests-not-running 
# http://stackoverflow.com/questions/13521618/c-project-organisation-with-gtest-cmake-and-doxygen 
# http://www.kaizou.org/2014/11/gtest-cmake/ 
cmake_minimum_required(VERSION 2.8) 
project(ThreadTest C CXX) 
ADD_SUBDIRECTORY (gtest-1.7.0) 
enable_testing() 

#set(THREADS_PREFER_PTHREAD_FLAG ON) 
find_package(Threads REQUIRED) 
find_package(GTest REQUIRED) 
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR}) 

if(NOT MSVC) 
    set(PThreadLib -pthread) 
endif() 

add_executable(ThreadTest main_test.cpp) 
target_link_libraries(ThreadTest ${PThreadLib} ${GTEST_LIBRARIES}) 
#add_test(ThreadTest ThreadTest) 

Я хочу обратить внимание на некоторые вещи: несколько ценных ссылок и

project(ThreadTest C CXX) rather than project(ThreadTest) 

и

set(PThreadLib -pthread) rather than set(PThreadLib pthread) 

Я думаю, остальное можно управлять. Это может быть хорошей отправной точкой.

0

Все, что вам нужно сделать, это связь с PTHREAD

target_link_libraries(BUILD_ARTIFACT pthread) 

BUILD_ARTIFACT может быть вашим проект, или имя библиотеки

PS Добавьте эту строку после определения вашего артефакта

PSS Вашего билд артефакт ThreadTest

add_executable(ThreadTest main_test.cpp) 
target_link_libraries(ThreadTest pthread) 
Смежные вопросы