আমি কেবল এটির দুর্দান্ত সমাধানের কথা চিন্তা করেছি যা উত্স এবং শিরোনাম ফাইল উভয়ের সাথেই কাজ করে, খুব কার্যকরী এবং সংকলক-নির্দিষ্ট এক্সটেনশন ছাড়াই সমস্ত প্ল্যাটফর্মে সংকলনের সময় কাজ করে। এই সমাধানটি আপনার প্রকল্পের আপেক্ষিক ডিরেক্টরি কাঠামো সংরক্ষণ করে, তাই আপনি জানেন যে ফাইলটি কোন ফোল্ডারে রয়েছে এবং কেবলমাত্র আপনার প্রকল্পের মূলের সাথে সম্পর্কিত।
আপনার বিল্ড সরঞ্জামটি দিয়ে উত্স ডিরেক্টরিটির আকার পেতে এবং এটি কেবল __FILE__
ম্যাক্রোর সাথে যুক্ত করে ডিরেক্টরিটি সম্পূর্ণভাবে সরিয়ে ফেলা হয় এবং কেবলমাত্র আপনার উত্স ডিরেক্টরিতে ফাইল নামটি দেখানো হয় The
নিম্নলিখিত উদাহরণটি সিএমকে ব্যবহার করে প্রয়োগ করা হয়েছে, তবে এটি অন্য কোনও বিল্ড সরঞ্জামগুলির সাথে কাজ করবে না এমন কোনও কারণ নেই, কারণ কৌশলটি খুব সহজ।
CMakeLists.txt ফাইলটিতে, এমন ম্যাক্রো সংজ্ঞায়িত করুন যা সিএমকে আপনার প্রকল্পের পথটির দৈর্ঘ্য রয়েছে:
# The additional / is important to remove the last character from the path.
# Note that it does not matter if the OS uses / or \, because we are only
# saving the path size.
string(LENGTH "${CMAKE_SOURCE_DIR}/" SOURCE_PATH_SIZE)
add_definitions("-DSOURCE_PATH_SIZE=${SOURCE_PATH_SIZE}")
আপনার উত্স কোডে, একটি __FILENAME__
ম্যাক্রো সংজ্ঞায়িত করুন যা কেবল ম্যাক্রোতে উত্স পথের আকার যুক্ত করে __FILE__
:
#define __FILENAME__ (__FILE__ + SOURCE_PATH_SIZE)
তারপরে কেবল ম্যাক্রোর পরিবর্তে এই নতুন ম্যাক্রোটি ব্যবহার করুন __FILE__
। এটি কাজ করে কারণ __FILE__
আপনার সিএমকে উত্স দিরের পথে সর্বদা পথটি শুরু হবে। __FILE__
স্ট্রিং থেকে এটিকে অপসারণ করে প্রিপ্রেসেসর সঠিক ফাইলের নাম নির্দিষ্ট করে দেওয়ার যত্ন নেবে এবং এটি সমস্ত আপনার সিএমকে প্রকল্পের মূলের সাথে সম্পর্কিত হবে।
আপনি যদি পারফরম্যান্স সম্পর্কে চিন্তা করেন তবে এটি ব্যবহারের মতো দক্ষ __FILE__
, কারণ উভয়ই __FILE__
এবংSOURCE_PATH_SIZE
টাইপ কনস্ট্যান্ট সংকলন হিসাবে পরিচিত, তাই এটি সংকলক দ্বারা অপ্টিমাইজ করা যায়।
এটি ব্যর্থ হওয়ার একমাত্র জায়গা হ'ল যদি আপনি এটি উত্পন্ন ফাইলগুলিতে ব্যবহার করেন এবং সেগুলি অফ-সোর্স বিল্ড ফোল্ডারে থাকে। তারপরে আপনাকে সম্ভবত CMAKE_BUILD_DIR
পরিবর্তকের পরিবর্তে আরও একটি ম্যাক্রো তৈরি করতে হবে CMAKE_SOURCE_DIR
।