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

use*_*964 11 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
Run Code Online (Sandbox Code Playgroud)

并且生成的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;
}
Run Code Online (Sandbox Code Playgroud)

从我建立的终端:

g++ main.cpp -I/home/user/gtest-1.7.0/include -L/home/user/gtest-1.7.0/lib/.libs -lpthread -lgtest
Run Code Online (Sandbox Code Playgroud)

这给出了以下错误:

/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
Run Code Online (Sandbox Code Playgroud)

基于此: 制作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
Run Code Online (Sandbox Code Playgroud)

编辑:我也试图指定-pthread为最后一个参数:

g++ main.cpp -I/home/user/gtest-1.7.0/include -L/home/user/gtest-1.7.0/lib/.libs -lgtest -pthread
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 16

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


小智 12

不,问题在于Gtest的构建.

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

相反,使用Cmake方法:

cd gtest-1.7.0
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这样做对我来说!:-) (3认同)

Mik*_*han 5

该选项-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
Run Code Online (Sandbox Code Playgroud)

使用:

g++ main.cpp -I/home/user/gtest-1.7.0/include /home/user/gtest-1.7.0/lib/.libs/libgtest.a -pthread
Run Code Online (Sandbox Code Playgroud)

请注意,您的命令行没有为生成的可执行文件提供名称,默认名称为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
Run Code Online (Sandbox Code Playgroud)

  • 如果不能使用动态库,它有什么作用?有没有办法使用libgtest.so来完成这项工作? (2认同)

par*_*ish 5

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

或者

移动-lpthread后面libgtest.a(顺序很重要)。