2016-01-03 8 views
9

से कैसे रोकें मेरे पास एक सीएमके निर्माण है जो विंडोज पर लिंकर को भेजता/IMPLIB भेजता है। यह मेरे मामले में एक समस्या है क्योंकि implib के लिए तर्क इनपुट फ़ाइलों में से एक के समान पथ है। मुझे लगता है कि विजुअल स्टूडियो के साथ निर्माण करते समय सीएमके हमेशा समस्या/IMPLIB होगा, और पारित तर्क को संशोधित नहीं किया जा सकता है। क्या इस व्यवहार को नियंत्रित करने का कोई तरीका है?सीएमके को जारी करने/IMPLIB

+0

नामों के लिए आप इनपुट फ़ाइलों को आयात li के समान क्यों देते हैं brary? और "पारित तर्क के साथ आपका क्या मतलब संशोधित नहीं किया जा सकता"? क्या आप नहीं जानते या कैसे नहीं जानते? – Youka

+0

@Youka अगर मैं समझता हूं कि आप पूछ रहे हैं कि इनपुट फ़ाइल और आयात लाइब्रेरी का एक ही नाम क्यों है। यह उसमें आकस्मिक है, उत्पाद को पुस्तकालय के रूप में या उसी लाइब्रेरी से प्राप्त निष्पादन योग्य के रूप में तैनात किया जा सकता है, इसलिए lib foo.lib है, exe foo.exe है। सीएमके स्पष्ट रूप से एक आयात पुस्तकालय बनाने की कोशिश करता है, जिसका नाम है ... foo.lib। प्रैक्टिस में यह लाइब्रेरी नहीं बनाई जाएगी (निर्यात करने के लिए कोई प्रतीक नहीं हैं!) लेकिन एमएसबिल्ड नाम का विरोध करेगा और इमारत को रोक देगा। –

+1

@Youka मेरा मानना ​​है कि उत्तीर्ण तर्क केवल उत्पाद नाम को बदलकर संशोधित किया जा सकता है, जो मुझे थोड़ा आश्चर्यचकित करता है। दूसरे शब्दों में मैं उम्मीद करता हूं कि अगर मैं foo.dll नामक लाइब्रेरी का निर्माण कर रहा था, तो आयात पुस्तकालय bar.dll नाम देने के लिए यह संभव होना चाहिए (हालांकि बीमार सलाह दी गई!)। लेकिन मुझे ऐसा करने का कोई रास्ता नहीं मिला है। जारी करने/IMPLIB से सीएमके को रोकना आदर्श होगा; आखिर में मुझे निष्पादन योग्य बनाने के साथ/IMPLIB के उपयोग के रूप में उपयोग नहीं दिख रहा है। –

उत्तर

1

मुझे लगता है कि सीएमके को लिंकर को /IMPLIB विकल्प जारी करने से रोकने के लिए यह संभव नहीं है। आप हालांकि किसी साझा लाइब्रेरी लक्ष्य के निम्नलिखित गुण स्थापित करने के द्वारा उत्पन्न आयात पुस्तकालय के नाम को नियंत्रित कर सकते हैं:

add_library(foo SHARED foo.cpp) 
# set base name of generated DLL import library 
set_target_properties(foo PROPERTIES ARCHIVE_OUTPUT_NAME "bar") 
# set prefix of generated DLL import library 
set_target_properties(foo PROPERTIES IMPORT_PREFIX "") 
# set suffix of generated DLL import library 
set_target_properties(foo PROPERTIES IMPORT_SUFFIX ".lib") 

उत्पन्न साझा लाइब्रेरी के नाम निम्नलिखित लक्ष्य गुण निर्धारित करके समायोजित किया जा सकता:

# set base name of generated DLL shared library 
set_target_properties(foo PROPERTIES RUNTIME_OUTPUT_NAME "bar") 
# set prefix of generated DLL shared library 
set_target_properties(foo PROPERTIES PREFIX "") 
# set suffix of generated DLL shared library 
set_target_properties(foo PROPERTIES SUFFIX ".dll") 
3

CMake के स्रोत cmComputeLinkInformation.cxx को देखते हुए यह केवल एक वैध /implib:... विकल्प जोड़ देगा, अगर CMAKE_IMPORT_LIBRARY_SUFFIX सेट है:

// Check whether we should use an import library for linking a target. 
this->UseImportLibrary = 
    this->Makefile->IsDefinitionSet("CMAKE_IMPORT_LIBRARY_SUFFIX"); 

तो निम्न परीक्षण में आयात पुस्तकालय मेरी निष्पादन योग्य परियोजना के विकल्पों में से हटा दिया गया था:

cmake_minimum_required(VERSION 3.0) 

project(NoImpLib CXX) 

unset(CMAKE_IMPORT_LIBRARY_SUFFIX) 

file(WRITE main.cpp "int main() { return 0; }") 
add_executable(${PROJECT_NAME} main.cpp) 

एक वी.एस. विशिष्ट वैकल्पिक - इस विकल्प विन्यास प्रति अन्यथा/सेट नहीं है क्योंकि - होगा वैश्विक संपत्ति IgnoreImportLibrary को जोड़ने के लिए:

set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_IgnoreImportLibrary "true")