سؤال

أحاول إنشاء مشروع باستخدام Boost's Asio وأواجه بعض المشاكل.في البداية، حاولت بناء المشروع دون أي مكتبات إضافية حيث من المفترض أن يكون كل شيء في ملفات الرأس.

يبدو البرنامج الذي أحاول بناءه كما يلي:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));

    t.wait();

    std::cout << "Hello, world!" << std::endl;

    return 0;
}

يمكن إيجادها هنا على موقع Boost.

لذلك، في البداية كان لدي فقط:

-I /usr/include/boost_1_40_0

وقد أدى ذلك إلى الأخطاء التالية:

make -k all
Building target: HelloWorld
Invoking: GCC C++ Linker
g++  -o"HelloWorld"  ./main.o  
./main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost_1_40_0/boost/system/error_code.hpp:205: undefined reference to `boost::system::get_system_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:206: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:211: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:212: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:213: undefined reference to `boost::system::get_system_category()'
./main.o: In function `boost::asio::error::get_system_category()':
/usr/include/boost_1_40_0/boost/asio/error.hpp:218: undefined reference to `boost::system::get_system_category()'
./main.o: In function `error_code':
/usr/include/boost_1_40_0/boost/system/error_code.hpp:312: undefined reference to `boost::system::get_system_category()'
./main.o: In function `posix_tss_ptr':
/usr/include/boost_1_40_0/boost/asio/detail/posix_tss_ptr.hpp:47: undefined reference to `pthread_key_create'
./main.o: In function `~posix_tss_ptr':
/usr/include/boost_1_40_0/boost/asio/detail/posix_tss_ptr.hpp:61: undefined reference to `pthread_key_delete'
./main.o: In function `boost::asio::detail::posix_thread::join()':
/usr/include/boost_1_40_0/boost/asio/detail/posix_thread.hpp:77: undefined reference to `pthread_join'
./main.o: In function `~posix_thread':
/usr/include/boost_1_40_0/boost/asio/detail/posix_thread.hpp:69: undefined reference to `pthread_detach'
collect2: ld returned 1 exit status
make: *** [HelloWorld] Error 1
make: Target `all' not remade because of errors.

يبدو أنني بحاجة إلى مكتبة النظام.لذلك، اتبعت الإرشادات الموجودة في دليل البدء الموجود هنا, ، مما أعطاني مجموعة من المكتبات الموجودة في /usr/include/boost_1_40_0/stage/lib.وكان من بينهم libboost_system.a.وهكذا حاولت التجميع مع:

-I /usr/include/boost_1_40_0
-L /usr/include/boost_1_40_0/stage/lib
-l libboost_system

ومع ذلك، حصلت على هذا:

make -k all
Building target: HelloWorld
Invoking: GCC C++ Linker
g++ -L/usr/lib -L/usr/include/boost_1_40_0/stage/lib -o"HelloWorld"  ./main.o   -llibboost_system
/usr/bin/ld: cannot find -llibboost_system
collect2: ld returned 1 exit status
make: *** [HelloWorld] Error 1
make: Target `all' not remade because of errors.

لست متأكدًا من السبب، ولكن يبدو أنه لا يمكنني تحديد المكتبة أو أي من المكتبات الأخرى التي أحاول القيام بها.ما الذي قد أفعله بشكل غير صحيح؟شكرا لك مقدما!

هل كانت مفيدة؟

المحلول

يتغير -llibboost_system ل -lboost_system.

في نظام التشغيل Linux، لا يتم استخدام البادئة "lib" الموجودة أمام المكتبة عند الرجوع إلى المكتبة المذكورة.

نصائح أخرى

في هذه الحالة كانت إجابة جيمس صحيحة، ولكن إذا عثر أي شخص آخر على هذا المنشور مثلما فعلت، فاعلم أنه يمكنك الحصول على هذه الرسالة إذا قمت بربط رؤوس التعزيز القديمة بالمكتبات الأحدث. get_system_category() تم إهمالها على وجه التحديد.لقد واجهت هذه المشكلة أثناء تضمين الرؤوس المقدمة من التوزيعة عن طريق الخطأ ولكنني قمت بالربط بنسختي الداخلية من التعزيز.

إذا كنت لا تزال تواجه مشكلات، فقد ترغب في تضمين مؤشرات الترابط posix عن طريق إضافة إشارات الرابط:

-lpthread
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top