मैं cmake संस्करण 3.9.1 का उपयोग कर रहा हूँ।

मेरे पास मेरे स्रोत पेड़ में एक तृतीय पक्ष साझा लाइब्रेरी और हेडर फ़ाइल है। मैं इसे एक लिंक लक्ष्य के रूप में जोड़ने की कोशिश कर रहा हूं।

मुझे जो भी दस्तावेज मिल सकते हैं, वे कहते हैं कि यह काम करना चाहिए:

test.cpp

#include "ftd2xx.h"

int main(int argc, char **argv)
{
    FT_HANDLE handle;
    FT_STATUS status = FT_Open(1, &handle);

    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 3.6)
project(test_proj CXX)
add_subdirectory(ftdi)
add_executable(mytest test.cpp)
target_link_libraries(mytest ftd2xx)

ftdi/CMakeLists.txt

add_library(ftd2xx SHARED IMPORTED)
set_target_properties(ftd2xx PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
set_target_properties(ftd2xx PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR})

हालाँकि, test.cpp को संकलित करना, जिसमें "ftd2xx.h" शामिल है, शिकायत करता है कि उसे हेडर फ़ाइल नहीं मिल रही है और संबंधित -I<path> प्रविष्टि उत्पन्न मेकफ़ाइल्स से गायब है।

अगर मैं पुस्तकालय को SHARED IMPORTED के बजाय INTERFACE के रूप में निर्दिष्ट करता हूं तो हेडर फ़ाइल सही ढंग से मिलती है, लेकिन सीएमके IMPORTED_LOCATION संपत्ति सेट करने पर बारफ करता है।

यदि मैं पुस्तकालय को SHARED IMPORTED के बजाय INTERFACE के रूप में निर्दिष्ट करता हूं और फिर target_link_libraries का उपयोग सीधे पुस्तकालय फ़ाइल को इंगित करने के लिए करता हूं, तो यह विंडोज के लिए काम करता है लेकिन लिनक्स के लिए नहीं।

मैं किसी भी मदद की सराहना करता हूं जो कोई भी पेशकश कर सकता है।

5
AlastairG 22 सितंबर 2017, 12:09

1 उत्तर

सबसे बढ़िया उत्तर

सीएमके दस्तावेज वास्तव में इसका उत्तर देता है, लेकिन इतना संक्षिप्त रूप से, और एक बहुत बड़े अनुच्छेद के बीच में, इसे याद करना आसान है:

The target name has scope in the directory in which it is created and below, but the GLOBAL option extends visibility.

मैं उच्च स्तरीय निर्देशिका में लक्ष्य नाम का उपयोग कर रहा हूं, इसलिए मुझे पुस्तकालय को केवल SHARED IMPORTED के बजाय SHARED IMPORTED GLOBAL के रूप में घोषित करने की आवश्यकता है।

अंतिम कोड है:

add_library(ftd2xx SHARED IMPORTED GLOBAL)
set_target_properties(ftd2xx PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})

और फिर विंडोज के लिए:

    set_target_properties(ftd2xx PROPERTIES IMPORTED_IMPLIB ${CMAKE_CURRENT_SOURCE_DIR}/win32/ftd2xx.lib)
    set_target_properties(ftd2xx PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/win32/ftd2xx.dll)

और लिनक्स के लिए:

    set_target_properties(ftd2xx PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/i386/libftd2xx.so)
6
AlastairG 29 सितंबर 2017, 18:06
2
क्रॉस-प्लेटफ़ॉर्म तरीके से ऐसा करने का कोई तरीका नहीं है? हमारी टीम में, हम लिनक्स और विंडोज दोनों पर काम कर रहे हैं और मुझे वास्तव में कुछ पोर्टेबल चाहिए, क्या cmake में ऐसा कुछ नहीं है? मैं ढूंढ रहा था पर नहीं मिला...
 – 
Darkiwi
31 अक्टूबर 2018, 15:46
1
हम अपने विंडोज पुस्तकालयों को अपने लिनक्स वाले से अलग रखते हैं, इसलिए हमारे पास प्रत्येक प्लेटफॉर्म के लिए अलग लाइनें क्यों हैं। इसके अलावा फ़ाइल नाम अलग हैं और विंडोज़ में आयात पुस्तकालय हैं और लिनक्स नहीं है। हालांकि प्रत्येक अनुभाग को उपयुक्त प्लेटफॉर्म डिटेक्शन सीएमके कोड जैसे if(CMAKE_SYSTEM_NAME STREQUAL "Windows") और if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") में लपेटें।
 – 
AlastairG
2 नवम्बर 2018, 10:52
हाँ, मैंने यही किया है, लेकिन मुझे यह अफ़सोस की बात है कि निर्यात/आयात मैकेनिक में सब कुछ ओएस/सीपीयू/कॉन्फ़िगरेशन-अज्ञेयवादी है सिवाय इसके। :-(
 – 
Darkiwi
2 नवम्बर 2018, 11:08