неопределенная ссылка на `pthread_key_create ‘(ошибка компоновщика)

Я скачал gtest 1.7.0 источников отсюда:

https://code.google.com/p/googletest/downloads/list

и создайте файлы gt.a (файлы lib) на ubuntu 13.10:

Linux ubuntu 3.11.0-15-generic #23-Ubuntu SMP Mon Dec 9 18:17:04 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 

и получившийся lib называется: libgtest.a . В моем файле main.cpp Have:

 #include  #include "gtest/gtest.h" int main(){ std::cout << "Test \n"; int argc = 2; char* cp01; char* cp02; char* argv[] = {cp01, cp02}; testing::InitGoogleTest(&argc, argv); return 0; } 

С терминала я строю с:

 g++ main.cpp -I/home/user/gtest-1.7.0/include -L/home/user/gtest-1.7.0/lib/.libs -lpthread -lgtest 

который дает следующие ошибки:

 /home/user/gtest-1.7.0/lib/.libs/libgtest.so: undefined reference to `pthread_key_create' /home/user/gtest-1.7.0/lib/.libs/libgtest.so: undefined reference to `pthread_getspecific' /home/user/gtest-1.7.0/lib/.libs/libgtest.so: undefined reference to `pthread_key_delete' /home/user/gtest-1.7.0/lib/.libs/libgtest.so: undefined reference to `pthread_setspecific' collect2: error: ld returned 1 exit status 

Исходя из этого: ошибка при создании GTest

Я также попытался -pthread вместо -lpthread но дал -lpthread же ошибку:

 g++ main.cpp -I/home/user/gtest-1.7.0/include -L/home/user/gtest-1.7.0/lib/.libs -pthread -lgtest 

EDIT: Я также попытался указать -pthread как последний аргумент:

 g++ main.cpp -I/home/user/gtest-1.7.0/include -L/home/user/gtest-1.7.0/lib/.libs -lgtest -pthread 

такая же ошибка Что я делаю неправильно?

    Опция -lgtest пытается связать динамическую библиотеку libgtest.so . Вы хотите связать статическую библиотеку /home/user/gtest-1.7.0/lib/.libs/libgtest.a .

    Вместо:

     g++ main.cpp -I/home/user/gtest-1.7.0/include -L/home/user/gtest-1.7.0/lib/.libs -lgtest -pthread 

    использовать:

     g++ main.cpp -I/home/user/gtest-1.7.0/include /home/user/gtest-1.7.0/lib/.libs/libgtest.a -pthread 

    Обратите внимание, что в вашей командной строке не указано имя для получаемого исполняемого файла, который по умолчанию будет a.out . Если вы хотите, чтобы его вызывали, например, mytest , выполните:

     g++ -o mytest main.cpp -I/home/user/gtest-1.7.0/include /home/user/gtest-1.7.0/lib/.libs/libgtest.a -pthread 

    Нет, проблема связана с построением Gtest.

    Если вы построите его с помощью стандартного подхода к настройке , он не -lpthread правильно -lpthread для создания libgtest.so . Следовательно, когда вы пытаетесь создать окончательную общую библиотеку, которая фактически использует возможности pthread, она терпит неудачу.

    Вместо этого используйте подход Cmake:

     cd gtest-1.7.0 mkdir build cd build cmake -DBUILD_SHARED_LIBS=ON .. make 

    И затем вручную установите их в /usr/lib/

    Эта версия корректно ссылается на libpthread на libgtest.

    Вам нужно указать -pthread после -lgtest . Компилятор берет библиотеки по порядку и принимает только столько, сколько нужно, чтобы разрешать ссылки, которые не определены в этой точке.

    Используйте -pthread вместо -lpthread (для связи с pthread-library), в то время как вы используете gtest в своем исполняемом файле.

    ИЛИ

    Переместите -lpthread после libgtest.a (последовательность имеет значение).

    Чтобы ответить, нам, вероятно, нужна дополнительная информация, вы на 64-битной машине и загрузили 32-битную библиотеку?

    Давайте будем гением компьютера.