2015-05-19 12 views
7

मैं टेस्ट चरण में एक नेटवर्क कॉन्फ़िगरेशन लोड करने की कोशिश कर रहा हूं जिसमें पहले मेमोरी डेटा परत है और फिर एक रूपांतरण परत है। MemoryData परत निर्माण सफल होता है, लेकिन घुमाव परत की रचना निम्नलिखित स्थान पर विफल रहता है:कैफी परत निर्माण विफलता

LOG(INFO) << "Creating layer " << param.name(); 
const string& type = param.type(); 
CreatorRegistry& registry = Registry(); 
CHECK_EQ(registry.count(type), 1) << "Unknown layer type: " << type 
<< " (known types: " << LayerTypeList() << ")"; 

मुद्रित त्रुटि है:

F0519 14: 54: 14,504 १२.४,९४,१३९ layer_factory.hpp: 77] की जांच विफल : registry.count (टी ype) == 1 (0 बनाम 1) अज्ञात परत के प्रकार: कनवल्शन (ज्ञात प्रकार: MemoryData)

रजिस्ट्री एम के साथ केवल एक प्रविष्टि, वास्तव में है emoryData। जब रजिस्ट्री निर्माण कार्यों में कदम है, यह ऐसा लगता है जैसे (और पिछले के बाद से यह एक singletone है) लग रहा है पहले

REGISTER_LAYER_CLASS(MemoryData); 

memory_data_later.cpp में से बुलाया।

मुझे अन्य समर्थित परतों के लिए समान REGISTER_LAYER_CLASS कॉल दिखाई देता है, लेकिन ऐसा लगता है कि उन्हें कभी नहीं कहा जाता है। मैं इसे कैसे हल कर सकता हूं?

धन्यवाद!

उत्तर

7

यह त्रुटि तब होती है जब कैफी को निष्पादन योग्य रूप से लिंक करने का प्रयास किया जाता है। यह सुनिश्चित करने के लिए कि परत पंजीकरण कोड शामिल हो, आपको अतिरिक्त लिंकर झंडे पास करने की आवश्यकता है।

आप cmake Targets.cmake पर एक नज़र डालें उपयोग कर रहे हैं:

########################################################################################### 
# Defines global Caffe_LINK flag, This flag is required to prevent linker from excluding 
# some objects which are not addressed directly but are registered via static constructors 
if(BUILD_SHARED_LIBS) 
    set(Caffe_LINK caffe) 
else() 
    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
    set(Caffe_LINK -Wl,-force_load caffe) 
    elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 
    set(Caffe_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) 
    endif() 
endif() 

और फिर जहां आप अपना लक्ष्य बनाना:

# target 
add_executable(${name} ${source}) 
target_link_libraries(${name} ${Caffe_LINK}) 

एक त्वरित समाधान का निर्माण और लिंक Caffe के रूप में किया जाएगा स्थैतिक के बजाय एक साझा lib।

भी this post देखें।

बस विंडोज पर MSVC संकलन के लिए यह पूरा करने के लिए: उपयोग /OPT:NOREF या /INCLUDE लक्ष्य निष्पादन या dll पर लिंकर विकल्प।

+0

यह बिल्कुल सही था। मैंने पहली बार लिंकर को "अप्रयुक्त" (= लगभग सभी परतें) ओबीजे फाइलों को एक हैकी बदसूरत तरीके से शामिल करने के लिए मजबूर कर दिया - आपका सुझाव निश्चित रूप से यहां करने के लिए सही चीज़ है। धन्यवाद! – rkellerm

+0

आईओएस में डायनामिक लाइब्रेरी का समर्थन नहीं किया। मैंने कैफे के लिए स्थिर lib बनाया। मुझे आईओएस में त्रुटि से ऊपर मिला। आपने इस त्रुटि को कैसे हल किया। – balajichinna

+1

@balajichinna: उदाहरण के लिए, आप एक हेडर फ़ाइल में एक डमी फ़ंक्शन को प्रोटोटाइप कर सकते हैं (उदाहरण के लिए layer_factory.hpp), इसे उस सीपीपी में कार्यान्वित करना जो उसका कोड लिंक नहीं है (उदाहरण के लिए layer_factory.cpp, और इसे हेडर के भीतर स्थिर रूप से कॉल करना, इसे प्रोटोटाइप किया गया था। उदाहरण के लिए: layer_factory.hpp: int lf_foo(); static int lf_dummy = lf_foo(); layer_factory.cpp में: int lf_foo() {return 0;}। बदसूरत, लेकिन काम करता है। – rkellerm

2

उचित स्थान पर अपने मेकफ़ाइल में $(STATIC_LINK_COMMAND) के साथ -l$(PROJECT) बदलें और अब अनावश्यक रनटाइम लोड पथ को हटाएं: -Wl,-rpath,$(ORIGIN)/../lib

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