2016-12-16 11 views
8

मेरे पास एक बाहरी प्रोजेक्ट और एक आयातित साझा लाइब्रेरी है। निर्देशिका में शामिल हैं और सही ढंग से सब काम implib, लेकिन साझा लाइब्रेरी (dll) स्थापित करने के लिए निम्न त्रुटि के साथ विफल कोशिश कर:क्या मैं साझा आयातित लाइब्रेरी इंस्टॉल कर सकता हूं?

install TARGETS given target "my_shared_lib" which does not exist in this directory. 

यहाँ कोड पुन: पेश करने के लिए:

add_library(my_shared_lib SHARED IMPORTED GLOBAL) 
set_property(TARGET my_shared_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib") 
set_property(TARGET my_shared_lib PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.dll") 
set_property(TARGET my_shared_lib PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.lib") 

add_executable(main main.cpp) 
add_dependencies(main my_shared_lib) 
target_link_libraries(main PUBLIC my_shared_lib) 

install(TARGETS main DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST") 
install(TARGETS my_shared_lib DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST") 

कोई भी विचार?


संपादित करें: अभी के लिए मैं get_property का उपयोग कर IMPORTED_LOCATION बाहर निकलने के लिए, तो फ़ाइलें इंस्टॉल का उपयोग कर और उस संपत्ति का मूल्य देकर इस समस्या को हल मिल गया है। ऐसा लगता है, लेकिन क्या एक बेहतर, अधिक idiomatic-cmake समाधान है?

उत्तर

6

CMake लक्ष्य रूप IMPORTED पुस्तकालयों स्थापित करने के लिए अनुमति नहीं है। इसके बजाय install(FILES) का उपयोग करें।

वहाँ कम से कम 2 इस तरह के व्यवहार के लिए कारण हैं:

  1. CMake डेवलपर से एक की bug report

    Imported targets were originally designed for importing from an existing installation of some external package so installing did not make sense at the time.

  2. जब सामान्य पुस्तकालय स्थापित से Сitation, CMake इसे संशोधित करने में सक्षम है RPATH जैसे कुछ गुणों को समायोजित करने के लिए। ऐसा संशोधन संभव है क्योंकि सीएमके जानता है कि पुस्तकालय कैसे बनाया गया है। यह लाइब्रेरी को TARGET के रूप में स्थापित करने का मुख्य लाभ है।

    लेकिन के लिए लाइब्रेरी सीएमके के पास पुस्तकालय की संकलन प्रक्रिया के बारे में कोई जानकारी नहीं है, और इसका कोई उचित संशोधन नहीं कर सकता है। इसलिए, सीएमके केवल पुस्तकालय फ़ाइल स्थापित कर सकता है: सरल install(FILES) के खिलाफ कोई फायदा नहीं।

+0

'rpath' वास्तव में कुछ गुण है कि योगिनी बाइनरी में काफी आसानी से संशोधित किया जा सकता से एक है https://nixos.org/patchelf.html – curlybracket

+0

स्थापित (लक्ष्य) यहां शामिल नहीं की एक उपयोगी संपत्ति है। यह से भी लिंक बनाता है। इसलिए .so। और .so। । यूनिक्स-जैसी प्रणालियों पर । –

संबंधित मुद्दे

 संबंधित मुद्दे