خطأ في رابط التعزيز:رمز خارجي لم يتم حله "تعزيز الفئة::system::error_category const & __cdecl Boost::system::get_system_category(void)"
-
21-08-2019 - |
سؤال
لقد بدأت للتو في استخدام Boost للمرة الأولى، التفاصيل:
- أنا أستخدم Visual Studio 2008 SP1
- أنا أقوم ببناء x64
- أنا أستخدم Boost::asio فقط (وأي تبعيات لها)
يتم الآن تجميع الكود الخاص بي، وقمت بتوجيه مشروعي إلى مكتبات التعزيز (بعد إنشاء x64 libs) وتجاوزت المشكلات البسيطة، والآن أواجه خطأ في الرابط:
2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_system_category(void)" (?get_system_category@system@boost@@YAAEBVerror_category@12@XZ)
2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_generic_category(void)" (?get_generic_category@system@boost@@YAAEBVerror_category@12@XZ)
أيه أفكار؟
أضفت هذا التعريف:#تعريف BOOST_LIB_DIAGNOSTIC
والآن في مخرجاتي أرى هذا:
1>Linking to lib file: libboost_system-vc90-mt-1_38.lib
1>Linking to lib file: libboost_date_time-vc90-mt-1_38.lib
1>Linking to lib file: libboost_regex-vc90-mt-1_38.lib
والذي يبدو أنه يشير إلى أنه رابط فعلي في نظام lib.
المحلول
حللت المشاكل.لقد قمت بإنشاء مكتبات 32 بت عندما كنت أنوي إنشاء مكتبات 64 بت.لقد أصلحت بيان البناء الخاص بي، وأنشأت مكتبات 64 بت، وهي تعمل الآن.
هنا هو سطر أوامر bjam الخاص بي:
C:\Program Files (x86)\boost\boost_1_38>bjam --build-dir=c:\boost --build-type=complete --toolset=msvc-9.0 address-model=64 architecture=x86 --with-system
نصائح أخرى
#include <boost/system/config.hpp>
في حالتي، لم يُظهر BOOST_LIB_DIAGNOSTIC أن النظام مرتبط تلقائيًا.لقد قمت بحل هذه المشكلة ببساطة عن طريق تضمين Boost/system/config.hpp.
تحتاج إلى الارتباط في مكتبة Boost_system
كان لي نفس المشكلة.حاولت كل ما هو موضح أعلاه، ولكن لا شيء يساعد.وكان الحل بسيطا:في البداية عملت مع مشروع فارغ وكان هناك خطأ في الرابط LNK2019.ولكن عندما قمت بإنشاء تطبيق وحدة التحكم Win32 الافتراضي الجديد باستخدام ملفات stdafx.h وtargetver.h وstdafx.cpp، نجح كل شيء.قد يكون مفيدًا لشخص ما، أقضي يومين من أجل ذلك
إذا كنت تستخدم تعزيز :: النظام في مشروعك، يجب عليك استخدام وتعيين الإصدار x86 أو x64 من Boost::system lib.
يمكنك إعادة ترجمة مكتبة Boost بالملف الدفعي التالي.احفظها في مجلد Boost root وقم بتشغيله في CMD Windows (لا تنقر نقرًا مزدوجًا!):
call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86
cd boost_1_60_0
call bootstrap.bat
rem Most libraries can be static libraries
b2 -j8 toolset=msvc-14.0 address-model=64 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/x64
b2 -j8 toolset=msvc-14.0 address-model=32 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/win32
pause
لمزيد من التفاصيل يمكنك الاطلاع على هذا المقال: https://studiofreya.com/2015/12/19/how-to-build-boost-1-60-with-visual-studio-2015/
لقد توصلت إلى السؤال من خلال البحث عن خطأ الرابط بالإضافة إلى CMAKE، لذلك أقوم بإضافة هذا التعليق هنا في حالة عثور أي شخص آخر على هذا السؤال بنفس الطريقة.
اتضح أن خطأ الرابط في حالتي كان بسبب خطأ:
add_definitions(-DBOOST_ALL_DYN_LINK)
في ال CMakeLists.txt
, ، وهو أمر جيد لنظام التشغيل Unix، ولكن ليس لنظام التشغيل Windows في حالتي.الحل ليس الاستخدام الذي يحدده Windows.
كنت بحاجة إلى كلا الإصدارين واستخدام هدف المرحلة، لذلك استخدمت --stagedir=./stageX86 للإصدار x86 والإعداد الافتراضي ./stage لـ x64
لقد أتيت إلى هنا أيضًا بسبب خطأ الرابط هذا بالإضافة إلى CMake، ولكن في حالتي كانت حقيقة أن CMake افتراضيًا سيحاول الإنشاء باستخدام 32 بت افتراضيًا.تم إصلاح هذا عن طريق التحديد -Ax64
cmake -Ax64 {path to CMakeLists.txt}