64-বিট উবুন্টুতে 32-বিট অ্যাপ তৈরি করা Building


23

কয়েক ঘন্টা গুগল করার পরে, আমি আপনাকে ছেড়ে দেওয়ার এবং আপনাকে বিশেষজ্ঞদের জিজ্ঞাসা করার সিদ্ধান্ত নিয়েছি। আমি আমার 64 উবুন্টু ১১.১০-তে একটি 32-বিট অ্যাপ্লিকেশন (যদি কেউ আগ্রহী তবে এক্সগ্যাপ) তৈরি করার চেষ্টা করছি। আমি মেকফাইলে সিএফএলএগএস = -m32 এবং এলডিএফএলএজিএস = -L / usr / lib32 যুক্ত করেছি । অবজেক্টগুলি 32 বিট জরিমানা করে তৈরি করা হয়। শেষ পদক্ষেপটি হ'ল এক্স উইন্ডোজের জন্য সমস্ত অবজেক্ট এবং লাইব্রেরিগুলিকে এই এক্সিকিউটেবল --- এক্সগ্যাপে লিঙ্ক করা। এটি কোনওভাবে আমাকে এই ত্রুটি দেয়:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

আমি ia32 -libs এবং mutilib সমর্থন ইনস্টল করেছি । আমি মনে করি কেবল লিঙ্কারকে i386 আউটপুট উত্পন্ন করতে বাধ্য করতে হবে। আমি আমার জিসিসি কমান্ডে দুটি এলডি পতাকা রাখার চেষ্টা করেছি যেমন উপরে প্রদর্শিত হয়েছে: -মেল্ফ_আই 386 এবং -ফর্ম্যাট এলফ 32-i386 । তবে যা ঘটে তা হ'ল জিসিসি আর / usr / lib32 তে 32 বিট লাইব্রেরি অনুসন্ধান করে না । আমি ভাবছি যদি আমাকে এই পতাকাগুলি কিছু নির্দিষ্ট ক্রমে রাখার দরকার হয়?

কোন ধারণা এবং সাহায্যের জন্য ধন্যবাদ!

সম্পাদনা করুন: যখন আমি আমার শেষ জিসিসি কমান্ড -m32 পতাকা যুক্ত করি (আমি বিশ্বাস করি যে লিঙ্কিং স্টেজ) আমি এমনকি জায়গায় -L / usr / lib32 পতাকা রাখি, জিসিসি আর / usr / lib32 অনুসন্ধান করে না (সত্যিই অদ্ভুত ...) এবং নিম্নলিখিত ত্রুটি উত্পন্ন করে:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

কারও ধারণা আছে কেন এমন হয়? আমি কনফিগার এবং তৈরি করতে অটো সরঞ্জাম ব্যবহার করছি। আমি এই স্ক্রিপ্ট ফাইলগুলি পরিবর্তন করতে সত্যিই ভাল।

ইআইডিডি : আমি সমস্যাটি সমাধান করেছি। আমি মনে করি যে সিসিটি স্থির গ্রন্থাগার সংরক্ষণাগারটি প্রত্যাশা করেছিল। লিঙ্কের জন্য প্রয়োজনীয় সমস্ত .a সংরক্ষণাগার ডাউনলোড করতে আমি http://ubuntuforums.org/showthread.php?t=474790 থেকে getlibs স্ক্রিপ্টটি ব্যবহার করেছি । তারপরে জিসিসি কাজ করেছিল। আমি মনে করি জিসিসি খোজ দা সার্চ মারলে , / usr / lib32 ডিরেক্টরির কিন্তু খুঁজে পাইনি .a আর্কাইভ তাই মান ডিরেক্টরির যা অনুসন্ধান করেন / usr / lib যেখানে এটি খুঁজে বের করে বেমানান, .so * ফাইল।

তবে তারপরে প্রশ্নটি হল: * .so ফাইলগুলি / usr / lib32 / প্যাকেজ থেকে ia32 -libs আসলে লিঙ্কিংয়ের জন্য লাইব্রেরিগুলির প্রয়োজন নেই? / Usr / lib32 / এ থাকা ফাইলগুলি কীসের জন্য ব্যবহৃত হয়?



উত্তর:


15

LDFLAGS-m32পাশাপাশি অন্তর্ভুক্ত করা উচিত । নিম্নলিখিতগুলি কাজ করা উচিত:

export LDFLAGS='-m32 -L/usr/lib32'

প্রকৃতপক্ষে, আপনি -L/usr/lib32অংশটি ফেলে দিতে পারেন , যেহেতু এটি 32 বিবিট লিবসের জন্য একটি ডিফল্ট ডিরেক্টরি এবং আপনার সিস্টেমটি সে সম্পর্কে সচেতন।

মূলত, 64 বিট মেশিনে 32 বিট অ্যাপ্লিকেশন তৈরির সহজ উপায় হ'ল:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. অথবা আপনি যদি অটোটুল ব্যবহার করেন তবে স্ক্রিপ্টটি কনফিগার করতে সেই পরিবর্তনগুলিকে খাওয়ান।

হালনাগাদ:

দেখে মনে হচ্ছে আপনি স্থির এবং গতিশীল লাইব্রেরির সাথে সংযোগের পার্থক্য সম্পর্কে সত্যই পরিচিত নন। আমি যতটা সম্ভব ন্যূনতম হওয়ার চেষ্টা করব:

  • উভয় স্থিতিশীল এবং গতিশীল বিকাশ গ্রন্থাগার একই ফাইল এক্সটেনশন আছে .a
  • আপনি যদি একই লাইব্রেরির স্থিতিশীল এবং গতিশীল সংস্করণ উভয়ই ইনস্টল করেন তবে তাদের মধ্যে একটিতে ডায়ামিক libname.aএবং libname_s.aস্ট্যাটিক সংস্করণের মতো অতিরিক্ত পোস্টফিক্স থাকতে পারে ।
  • অবশ্যই, স্থির এবং গতিশীল গ্রন্থাগার সংস্করণ আকারে পৃথক। স্ট্যাটিক সংস্করণটি ভারী।
  • আপনি যদি স্থির লাইব্রেরির সাথে লিঙ্ক করেন - আপনার আবেদনের কোনও নির্ভরতা নেই। আপনি যদি গতিশীল লাইব্রেরির সাথে লিঙ্ক করেন তবে এটি .soরানটাইম লাইব্রেরির উপর নির্ভর করবে যা আপনার সিস্টেমে উপস্থিত থাকতে হবে।

দয়া করে মনে রাখবেন, আমরা এখানে dlopen () / dlsym () API ব্যবহার করে DSO এর সুস্পষ্ট লোডের মতো উন্নত কৌশল সম্পর্কে কথা বলছি না।


এখন আমি মনে করি আমার সেটআপে কিছু ভুল আছে। যখনই আমি আমার শেষ gcc কমান্ড -m32 যুক্ত করি, এটি পরিবর্তে / usr / lib ফোল্ডারটি অনুসন্ধান করে। যদি আমি -m32 যোগ না করে এবং -L / usr / lib32 পতাকা ব্যবহার করি তবে এটি সঠিক ডিরেক্টরিটি অনুসন্ধান করে তবে উপরের ত্রুটিগুলি তৈরি করেছে। আপনি জানেন কি এর কারণ হতে পারে?
ধনী

এবং যদি আপনি উভয়কে একত্রিত করেন (উপরের আমার উদাহরণ হিসাবে)?
আন্দ্রেজ ক্যানিকোভস

যদি আমি উভয়কে একত্রিত করি তবে এটি এখনও / usr / lib32 অনুসন্ধান করে না। এটি কেবল / usr / lib অনুসন্ধান করে। এবং বিটিডব্লিউ, আমি অটো সরঞ্জাম ব্যবহার করছি।
ধনী

অদ্ভুত .. আপনি কি -l/usr/lib32/libXaw.soপরিবর্তে খাওয়ানোর চেষ্টা করেছিলেন ?
আন্দ্রেজ ক্যানিকোভস

এটি তাদের খুঁজে পাচ্ছে না ....: gcc -o xgap xcmds.o utils.o gapراف.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: -l / usr / lib32 / libXaw.so খুঁজে পাচ্ছেন না
ধনী

9

আমি যেমন ত্রুটি পেয়েছিলাম:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

এটি আমার জন্য এটি স্থির করে:

sudo apt-get install g++-multilib

আপনি যদি ডিফল্ট (যেমন gcc-7) ব্যতীত অন্য কোনও জিসিসি প্যাকেজ ব্যবহার করেন তবে আপনাকে সেই নির্দিষ্ট সংস্করণের জন্য প্যাকেজটি ইনস্টল করতে হবে:

sudo apt-get install g++-7-multilib

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