Pregunta

I have downloaded gtest 1.7.0 sources from here:

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

and build the gtest .a files (lib files) on 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

and the resulting lib is called: libgtest.a. In my main.cpp file Have:

#include <iostream>
#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;
}

From a terminal I build with:

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

which gives the following errors:

/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

Based on this: error during making GTest

I have also tried -pthread instead of -lpthread but gives same error:

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

EDIT: I have also tried to specifying -pthread as the last argument:

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

same error What am I doing wrong?

¿Fue útil?

Solución 3

The option -lgtest is attempting to link the dynamic library libgtest.so. You wish to link the static library /home/user/gtest-1.7.0/lib/.libs/libgtest.a.

Instead of:

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

use:

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

Note that your commandline supplies no name for the resulting executable, which will default to a.out. If you want it called, e.g. mytest, then do:

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

Otros consejos

You need to specify -pthread after -lgtest. The linker takes libraries in order, and only takes as much as it needs to resolve references which are undefined at that point.

Nope, the problem is with Gtest's build.

If you build it using the standard configure approach, it isn't supplying the -lpthread correctly to create libgtest.so. Hence, when you try building a final shared library that actually uses the pthread capability it fails.

Instead, use the Cmake approach:

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

And then manually install these into /usr/lib/

This version correctly links in libpthread into libgtest.

Use -pthread instead of -lpthread (for linking with pthread-library), while you using gtest in your executable.

OR

Move the -lpthread after libgtest.a (sequence matters).

To answer we probably need more information, are you on a 64 bit machine and downloaded a 32 bit library?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top