web-dev-qa-db-ja.com

`pthread_key_create 'への未定義の参照(リンカーエラー)

ここからgtest1.7.0のソースをダウンロードしました:

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

そして、ubuntu13.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

これに基づく: 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

同じエラー何が間違っているのですか?

11
user3165964

オプション -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
5
Mike Kinghan

-pthreadの後に-lgtestを指定する必要があります。リンカはライブラリを順番に受け取り、その時点で未定義の参照を解決するために必要な量だけを受け取ります。

18
Mike Seymour

いいえ、問題はGtestのビルドにあります。

標準のconfigureアプローチを使用してビルドした場合、-lpthreadを作成するためのlibgtest.soが正しく提供されていません。したがって、実際にpthread機能を使用する最終的な共有ライブラリを構築しようとすると失敗します。

代わりに、Cmakeアプローチを使用してください。

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

そして、これらを手動で/usr/lib/にインストールします

このバージョンは、libpthreadでlibgtestに正しくリンクします。

12
jimi

実行可能ファイルでgtestを使用している間は、-pthread(pthread-libraryとのリンク用)の代わりに-lpthreadを使用してください。

[〜#〜]または[〜#〜]

-lpthreadlibgtest.aの後に移動します(順序は重要です)。

4
parasrish

答えるには、おそらくもっと情報が必要です。64ビットマシンを使用していて、32ビットライブラリをダウンロードしていますか?

0
Lambage