লিনাক্সে pthread_create সম্পর্কিত অপরিজ্ঞাত রেফারেন্স


376

আমি https://computing.llnl.gov/tutorials/pthreads/ থেকে ওয়েব থেকে নীচের ডেমোটি তুলেছি

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

তবে আমি যখন এটি আমার মেশিনে সংকলন করি (উবুন্টু লিনাক্স 9.04 চলছে) আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function main’:
term.c:23: warning: incompatible implicit declaration of built-in function exit
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

এটি আমার কাছে কোনও অর্থবোধ করে না, কারণ শিরোনামটিতে অন্তর্ভুক্ত রয়েছে pthread.h, যার pthread_createফাংশন থাকা উচিত । কোন ধারণা কি ভুল হচ্ছে?


6
অতিরিক্তভাবে: প্ল্যাটফর্মের উপর নির্ভর করে আপনার প্রয়োজন হতে পারে (ক) থ্রেডের জন্য আলাদা সংকলক, (খ) থ্রেডের (যেমন -lc_r), (সি) -threadবা অন্যটির -threadsপরিবর্তে বা সংযোজনের জন্য আলাদা লিবিসি -lpthread
প্রথম দিন

এই উদাহরণের একটু উপরে, আপনি সঠিক সংকলক কমান্ডগুলির একটি সারণী দেখতে পাবেন, এটি জিসিসি, আইবিএম ইত্যাদি etc. 'নিয়োগকৃত রাশিয়ান' সঠিক কিনা।
জোনাথন রেইনার্ট

8
আপনি কি দয়া করে আমার উত্তরটি অচিহ্নিত করতে পারেন, যাতে আমি এটিকে মুছতে পারি (এবং যা সত্যই সঠিক, যা সর্বাধিক-ভোটপ্রাপ্ত কোনটি চিহ্নিত করতে পারে)?
পাভেল মিনায়েভ

3
-lpthreadসংকলনের সময় প্রয়োজন
চেন

5
সমাধানLDFLAGS= -pthread -lpthread
dsnk

উত্তর:


695

এখনও পর্যন্ত এই প্রশ্নের উভয় উত্তরই ভুল
লিনাক্সের জন্য সঠিক কমান্ডটি হ'ল:

gcc -pthread -o term term.c

সাধারণভাবে, গ্রন্থাগারগুলিকে কমান্ড লাইনে উত্স এবং অবজেক্টগুলি অনুসরণ করা উচিত এবং -lpthreadএটি কোনও "বিকল্প" নয়, এটি একটি লাইব্রেরির নির্দিষ্টকরণ। কেবল libpthread.aইনস্টলড সিস্টেমে ,

gcc -lpthread ...

লিঙ্ক করতে ব্যর্থ হবে।


2
এই সমাধানটি +1 কাজ করেছে ... অন্যরকমগুলি করেন নি। এছাড়াও, 'লাইব্রেরিগুলির উত্স এবং অবজেক্টগুলি অনুসরণ করা উচিত "পরামর্শটি দুর্দান্ত পরামর্শ - একটি উদ্ধৃতি বা আরও ব্যাখ্যা দুর্দান্ত হবে।
sholsapp

7
@ শোলস্যাপ এখানে ব্যাখ্যা: ওয়েবপৃষ্ঠাগুলি.সিটার.নেট /
রাশিয়ান

আমার কমান্ডের একেবারে শেষেরভাগে-পড়া চালিয়ে যাওয়া পর্যন্ত এটি আমার পক্ষে ভুল হয়েছে। gcc term.c -lpthread
কর্নস্মিথ

আমি কেবল উবুন্টু ১৪.০৪ এ স্নোর্সাম সংকলন করে একটি ইস্যুতে দৌড়েছি যা আসলে লিবপথ্রেড.এ এবং লিপপথ্রেড.সো উভয়ই রয়েছে। আমি পেয়েছিলাম undefined reference to 'pthread_cancel'এবং undefined reference to 'pthread_create'ত্রুটি ছিল। আমি এই এসও পোস্টটি জুড়ে এসেছিলাম এবং ভেবেছিলাম নিয়োগকৃত রাশিয়ানদের উত্তরটি চেষ্টা করে দেখব। আমি makesnortsam.shVI এ খুললাম এবং :%s/lpthread/pthread/gppread এর সাথে lpthread প্রতিস্থাপন করার কমান্ডটি চালিয়েছি যাতে এটি সংকলনের -pthreadপরিবর্তে ব্যবহার করতে পারে -lpthread। আমি তখন স্নোরস্যাম সংকলন করতে সক্ষম হয়েছি। ধন্যবাদ নিয়োগকৃত রাশিয়ান!
ডিসিরিথ

5
কোডব্লকস ব্যবহার করা যে কোনও ব্যক্তির জন্য: -pthreadপ্রকল্পের বিল্ড বিকল্পগুলিতে যুক্ত করুন -> লিংকার সেটিংস -> অন্যান্য লিঙ্কার বিকল্প।
ব্যবহারকারী 3728501

39

গ্রহণে

বৈশিষ্ট্য-> সি / সি ++ বিল্ড-> সেটিং-> জিসিসি সি ++ লিঙ্কার-> শীর্ষ অংশের লাইব্রেরিগুলি "pthread" যুক্ত করে


কোড :: প্রকল্পে একই টিপ প্রয়োগ হয় (এবং আমি মনে করি অন্যরাও আইডিই করুন)
ফিলি

19

লিনাক্স টার্মিনাল থেকে চলমান, আমার জন্য যা কাজ করেছে তা নিম্নলিখিত কমান্ডটি ব্যবহার করে সংকলন করছে (ধরুন যে সি ফাইলটি আমি সংকলন করতে চাইছি তাকে টেস্ট.সি বলা হয়):

gcc -o test test.c -pthread

আশা করি এটি কারও সাহায্য করবে!


19

লিনাক্সের জন্য সঠিক কমান্ডটি হ'ল:

gcc -o term term.c -lpthread
  1. আপনাকে কমপাইল কমান্ডের ঠিক পরে -pthread লাগাতে হবে, এই কমান্ডটি সংকলককে pthread.h লাইব্রেরি সহ প্রোগ্রাম চালাতে বলবে।
  2. জিসিসি-এল একটি লাইব্রেরি ফাইলের সাথে লিঙ্ক করুন li লিব-প্রিফিক্স ছাড়া লাইব্রেরির নামের সাথে লিঙ্ক করুন।

যখন আপনার প্ল্যাটফর্মে একই ক্রিয়াকলাপ রয়েছে এমন একটি স্ট্যান্ডার্ড পতাকা উপস্থিত থাকে তখন একটি অ-মানক পতাকা ব্যবহার করা ভাল ধারণা নয়।
ডেভিড শোয়ার্জ

16

একিউটলি, এটি নীচের টেবিলের মধ্যে পাইথ্রেড কোডগুলির জন্য ব্যবহৃত কমপাইল কমান্ডগুলির কয়েকটি উদাহরণ দেয়, যদি আপনি নিম্নলিখিত টিউটোরিয়ালটি পড়া চালিয়ে যান:

https://computing.llnl.gov/tutorials/pthreads/#Compiling

এখানে চিত্র বর্ণনা লিখুন


12

আপনি যদি cmake ব্যবহার করছেন, আপনি ব্যবহার করতে পারেন:

add_compile_options(-pthread)

অথবা

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")


6

আমি বিশ্বাস করি যোগ করার সঠিক পথ pthreadCMakeনিম্নলিখিত সাথে আছেন

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

ভিজ্যুয়াল স্টুডিও 2019 -pthreadতে প্রকল্পের জন্য সম্পত্তি পৃষ্ঠাগুলিতে নির্দিষ্ট করুন :

লিঙ্কার -> কমান্ড লাইন -> অতিরিক্ত বিকল্প

-pthreadপাঠ্যবক্সে টাইপ করুন ।


3

আপনাকে -lpthreadজিসিসি সহ বিকল্পটি ব্যবহার করতে হবে ।


7
ভুল তথ্য! -lpthreadএটি কোনও "বিকল্প" নয়, এটি একটি লাইব্রেরি নির্দিষ্ট করে।

একটি কমান্ড লাইন বিকল্প (একটি কমান্ড লাইনের যুক্তির বিপরীতে)
আলেকজান্ডার স্টোহর

3

আপনার কেবল প্রোপ্রাইটিস => সি / সি ++ বিল্ড => জিসিসি সি ++ লিঙ্কার => লাইব্রেরি => শীর্ষ অংশ "লাইব্রেরি (-l)" এ "অজানা" যুক্ত হওয়া দরকার। এটাই


2

ম্যান পৃষ্ঠা পরীক্ষা করুন এবং আপনি পাবেন।

সংকলন এবং -পথের সাথে লিঙ্ক।

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....

0

অঞ্জুতায়, বিল্ড মেনুতে যান, তারপরে প্রকল্পটি কনফিগার করুন। কনফিগার বিকল্প বিকল্প বাক্সে, যুক্ত করুন:

LDFLAGS='-lpthread'

আশা করি এটিও কাউকে সাহায্য করবে ...


0

কখনও কখনও, আপনি যদি একাধিক গ্রন্থাগার ব্যবহার করেন তবে গ্রন্থাগারের নির্ভরতা পরীক্ষা করুন। (উদাঃ -প্রথম -LSDL ... <==> ... -lSDL -pthread)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.