यदि आप बहुत सामान्य तरीके से cmake और pkg-config का उपयोग कर रहे हैं, तो यह समाधान काम करता है।
यदि, हालांकि, आपके पास एक पुस्तकालय है जो कुछ विकास निर्देशिका (जैसे / घर / मुझे / हैक / परिवाद) में मौजूद है, तो यहां देखे गए अन्य तरीकों का उपयोग करके लिंकर पथों को कॉन्फ़िगर करने में विफल रहता है। आमतौर पर इंस्टॉल किए गए स्थानों के नीचे पाई जाने वाली लाइब्रेरियों में लिंकर की त्रुटियां होती हैं, जैसे /usr/bin/ld: cannot find -lmy-hacking-library-1.0
। यह समाधान उस स्थिति के लिए लिंकर त्रुटि को ठीक करता है।
एक और मुद्दा यह हो सकता है कि pkg-config फ़ाइलें सामान्य स्थान पर स्थापित नहीं हैं, और प्रोजेक्ट के लिए pkg-config रास्तों को PKG_CONFIG_PATH परिवेश चर का उपयोग करके जोड़ा जाना चाहिए, जबकि cmake चल रहा है (देखें इसके बारे में स्टैक ओवरफ्लो प्रश्न देखें)। मान लें कि आपके पास सही pkg-config पथ सेट है, तो यह समाधान उस समस्या को भी ठीक करता है।
समाधान कार्यशील CMakeLists.txt के इस अंतिम संस्करण को उबालता है:
cmake_minimum_required(VERSION 3.14)
project(ya-project C)
# the `pkg_check_modules` function is created with this call
find_package(PkgConfig REQUIRED)
# these calls create special `PkgConfig::<MODULE>` variables
pkg_check_modules(MY_PKG REQUIRED IMPORTED_TARGET any-package)
pkg_check_modules(YOUR_PKG REQUIRED IMPORTED_TARGET ya-package)
add_executable(program-name file.c ya.c)
target_link_libraries(program-name PUBLIC
PkgConfig::MY_PKG
PkgConfig::YOUR_PKG)
ध्यान दें कि target_link_libraries
लिंकर कमांड को बदलने से अधिक है। यह निर्दिष्ट लक्ष्यों के अन्य सार्वजनिक गुणों को भी प्रचारित करता है जैसे: संकलक झंडे, संकलक परिभाषित, पथ शामिल हैं, आदि।
IMPORTED_TARGET
सीएमके 3.6 या नए की आवश्यकता है।