मेरे पास निम्न कोड है:

project(test)
cmake_minimum_required(VERSION 3.17)

set(PNG_DIR C:/Users/Kagami/.emscripten_cache/wasm/ports-builds/libpng)

find_library(PNG_STATIC_LIBRARY
  NAMES libpng.a
  HINTS ${PNG_DIR}
)

message(${PNG_DIR})
message(${PNG_STATIC_LIBRARY})

मेरे पास उस PNG_DIR निर्देशिका में libpng.a नाम की एक फ़ाइल है लेकिन find_library अभी भी -NOTFOUND लौटाती है। संभावित कारण क्या होंगे?

0
Kagami Sascha Rosylight 19 अप्रैल 2020, 14:56
find_path काम करता है, पता नहीं क्यों find_library
 – 
Kagami Sascha Rosylight
19 अप्रैल 2020, 17:02

2 जवाब

find_library को एक पुस्तकालय मिलेगा जिसका उपयोग आपके द्वारा उपयोग किए जाने वाले आर्च के साथ किया जा सकता है। तो आपके विंडोज़ पर यह .a के लिए नहीं बल्कि .lib के लिए दिखेगा।

लेकिन find_path केवल एक फ़ाइल खोजें, इससे कोई फ़र्क नहीं पड़ता कि यह एक वास्तविक पुस्तकालय है या नहीं।

दस्तावेज़ीकरण से:

NAMES विकल्प को दिए गए प्रत्येक लाइब्रेरी नाम को पहले लाइब्रेरी फ़ाइल नाम के रूप में माना जाता है और फिर प्लेटफ़ॉर्म-विशिष्ट उपसर्गों (उदा. lib) और प्रत्यय (उदा. .so) के साथ माना जाता है। इसलिए कोई पुस्तकालय फ़ाइल नाम निर्दिष्ट कर सकता है जैसे कि libfoo.a सीधे। इसका उपयोग यूनिक्स जैसी प्रणालियों पर स्थिर पुस्तकालयों का पता लगाने के लिए किया जा सकता है।

1
Aurélien Foucault 20 अप्रैल 2020, 14:56

find_library का NAMES पैरामीटर लाइब्रेरी का नाम बताता है, फ़ाइल का नाम नहीं।

तो आपके मामले में सही आदेश होगा

find_library(PNG_STATIC_LIBRARY
  NAMES png
  HINTS ${PNG_DIR}
)

ध्यान दें कि आप NAMES को तर्क के रूप में एक से अधिक नाम दे सकते हैं, यदि पुस्तकालय अलग-अलग प्लेटफार्मों पर अलग-अलग नामों के तहत आता है।

यहां एक अतिरिक्त जटिलता इस तथ्य से आती है कि विंडोज़ पर हमारे पास दो असंगत टूलचेन, मिनजीडब्ल्यू और एमएसवीसी हैं। यदि आपकी लाइब्रेरी में एक .a फ़ाइल समाप्त हो रही है, तो यह लगभग निश्चित रूप से MinGW टूलचेन के लिए संकलित की गई थी, इसलिए आप इसे विजुअल स्टूडियो बिल्ड से उपयोग नहीं कर पाएंगे। यहां आपको सबसे पहले लाइब्रेरी को सही टूलचेन के साथ फिर से कंपाइल करना होगा।

0
ComicSansMS 20 अप्रैल 2020, 15:03
1
"find_library का NAMES पैरामीटर लाइब्रेरी का नाम बताता है, फ़ाइल नहीं नाम।" - बिल्कुल सच नहीं। दस्तावेज़ नीचे दिए गए NAMES पैरामीटर के वास्तविक अर्थ का वर्णन करता है: "NAMES विकल्प को दिए गए प्रत्येक लाइब्रेरी नाम को पहले लाइब्रेरी फ़ाइल नाम के रूप में माना जाता है और फिर प्लेटफ़ॉर्म-विशिष्ट उपसर्गों (जैसे lib) और प्रत्ययों के साथ माना जाता है। (उदाहरण के लिए .so)। इसलिए कोई पुस्तकालय फ़ाइल नाम निर्दिष्ट कर सकता है जैसे libfoo.a सीधे।"
 – 
Tsyvarev
20 अप्रैल 2020, 16:13