对'pthread_key_create'的未定义引用(链接器错误)

时间:2014-01-14 14:57:23

标签: c++ googletest

我从这里下载了gtest 1.7.0来源:

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

并在ubuntu 13.10上构建gtest .a文件(lib文件):

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文件中有:

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

从我建立的终端:

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

基于此: error during making GTest

我还尝试了-pthread而不是-lpthread,但也提出了同样的错误:

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

编辑:我还尝试将-pthread指定为最后一个参数:

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

同样的错误 我做错了什么?

5 个答案:

答案 0 :(得分:13)

您需要在-pthread之后指定-lgtest。链接器按顺序获取库,并且只需要解析那时未定义的引用所需的数量。

答案 1 :(得分:12)

不,问题在于Gtest的构建。

如果您使用标准配置方法构建它,则无法正确提供-lpthread来创建libgtest.so。因此,当您尝试构建实际使用pthread功能的最终共享库时,它会失败。

相反,请使用Cmake方法:

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

然后将这些手动安装到/usr/lib/

此版本正确地将libpthread链接到libgtest。

答案 2 :(得分:4)

选项-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

答案 3 :(得分:4)

在您的可执行文件中使用gtest时,使用-pthread代替-lpthread(用于链接pthread-library)。

-lpthread之后移动libgtest.a(序列很重要)。

答案 4 :(得分:0)

要回答我们可能需要更多信息,您是否在64位计算机上并下载了32位库?