2015-08-26 8 views
6

मैंने हाल ही में कैफे C++ classification example file संशोधित किया है और मैं इसे पुन: संकलित करने की कोशिश कर रहा हूं। हालांकि, मुझे निर्देशिका में .hpp फ़ाइलों में एक साधारण g ++ संकलन को जोड़ने में समस्या हो रही है। मुझे पता है कि यह एक बुनियादी सवाल है लेकिन मैं इसे काम नहीं कर सकता - क्या कोई इस कार्यक्रम को संकलित करने के तरीके में मेरी मदद कर सकता है? संकलन अब इस तरह दिखता है:संकलन कैफे सी ++ वर्गीकरण उदाहरण

g++ -I /home/jack/caffe/include classification.cpp -o classify 

लेकिन मैं इस त्रुटि हो रही है:

In file included from /home/jack/caffe/include/caffe/common.hpp:19:0, 
    from /home/jack/caffe/include/caffe/blob.hpp:8, 
    from /home/jack/caffe/include/caffe/caffe.hpp:7, 
    from classification.cpp:1: 
/home/jack/caffe/include/caffe/util/device_alternate.hpp:34:23: fatal error: cublas_v2.h: No such file or directory 
#include <cublas_v2.h> 

मैं NVIDIA GPUs के बिना एक मशीन पर यह चल रहा हूँ, इसलिए जब मैं device_alternate.hpp फ़ाइल को देखा मुझे एहसास हुआ कि यह बहुत सी क्यूडा से संबंधित। एचपीपी फाइलों को बुला रहा है जो कि अस्तित्व में नहीं है।

+1

सटीक आदेश आप संकलन के लिए प्रयोग कर रहे हैं, और आप हो रही है त्रुटि संदेश पोस्ट करें स्थापित करने के लिए। – Shai

+0

धन्यवाद शाई, अभी प्रश्न –

उत्तर

4

आमतौर पर, आदेश संकलक मदद करने के लिए शीर्ष लेख फ़ाइल का पता लगाएं संकलन लाइन के लिए -I /path/to/include/folder विकल्प जोड़ने की जरूरत:

~$ g++ -I /path/to/caffe/include myfile.cpp 
+0

मदद के लिए धन्यवाद - दुर्भाग्य से ऐसा लगता है कि कैफ़े को खोजने के लिए मुझे कुछ नई संकलन त्रुटियां मिली हैं। एचपीपी फाइलें! –

+1

@ जैकसिम्पसन आपको अन्य टूल में अधिक '-I' विकल्प जोड़ने की आवश्यकता है, इस बार आपके 'cuda' में फ़ोल्डर शामिल है। कोशिश करें और देखें कि संकलन करते समय कैफे का उपयोग किस प्रकार किया जा रहा है। – Shai

4

आप Caffe में कस्टम फ़ाइलों का निर्माण करना चाहते हैं, तो वहाँ दो तरीके हैं

आसान तरीका

  • आवश्यक परिवर्तन करें और फ़ाइल (आपके मामले में - classification.cpp) रखने insid ई ई कैफे रूट निर्देशिका में उदाहरण फ़ोल्डर में एक निर्देशिका (परीक्षण कहें)।
  • रन make। यह स्वचालित रूप से आवश्यक cxxflags और ldflags जोड़ देगा और आपके कोड को संकलित करेगा और निष्पादन योग्य को बिल्ड/उदाहरण/परीक्षण फ़ोल्डर में रखेगा। यह भी झंडा CPU_ONLY सेट कर दिया जाता

हार्ड रास्ता

  • भागो सुंदर प्रिंट विकल्प के बिना बनाना (के रूप में Makefile.config में उल्लेख किया है) यह सुनिश्चित (Makefile अंदर उल्लेख किया .config)। आप उदाहरण और टूल बनाने के लिए उपयोग किए गए संकलन और लिंक विकल्प देख पाएंगे। आप कॉपी और इन विकल्पों में पेस्ट कर सकते हैं (और अगर इस्तेमाल किया संबंधित पथ के लिए आवश्यक परिवर्तन) अपनी फ़ाइल

आशा संकलित करने के लिए इस

में मदद करता है संपादित सेशन के रूप में एक आसान तरीका का अनुरोध किया है, यह हो सकता है

यह एक बहुत ही न्यूनतम उदाहरण है और मैं ओपी को पूर्ण ऑनलाइन दस्तावेज़ीकरण और सेमेक उपयोग के उदाहरण को संदर्भित करने के लिए प्रोत्साहित करता हूं।

  • आवश्यकताओं
    • Caffe जरूरत cmake साथ निर्मित किया जाना - अपेक्षाकृत आसान के रूप में वर्तमान मास्टर शाखा CMakeLists और सब कुछ परिभाषित है।अपने विकल्पों को

स्थापित करने के लिए अब, मैं यह सोचते हैं रहा हूँ आप एक परियोजना संरचना इस प्रकार है CMake-जीयूआई या ccmake का प्रयोग करें।

-project 
    - src 
     - class1.cpp 
     - CMakeLists.txt (to be added) 
    - include 
     - class1.hpp 

    - main.cpp 
    - CMakeLists.txt (to be added) 

CMakeLists.txt (एसआरसी) को रोकने के लिए निम्नलिखित लाइनों (न्यूनतम पर ) की जरूरत है,

cmake_minimum_required(VERSION 2.8) 
find_package(OpenCV REQUIRED) # Optional in case of dependency on opencv 
add_library(c1 class1.cpp) 

नोट: मामले Class1 में अन्य बाहरी पुस्तकालयों पर, के लिए पथ निर्भर करता है शीर्षलेखों को include_directories का उपयोग करके शामिल किया जाना चाहिए।

CMakeLists.txt (सबसे बाहरी) न्यूनतम

cmake_minimum_required(VERSION 2.8) 
PROJECT(MyProject) 

find_package(OpenCV REQUIRED) 
find_package(Caffe REQUIRED) 

include_directories("${PROJECT_SOURCE_DIR}/include") 
add_subdirectory(src) 

include_directories("$Caffe_INCLUDE_DIRS}") 
add_executable(MyProject main.cpp) 

target_link_libraries(MyProject ${OpenCV_LIBS} c1 ${Caffe_LIBRARIES})  

पर निम्न अब, परियोजना निर्देशिका के अंदर से निम्न कमांड build फ़ोल्डर के अंदर निष्पादन MyProject पैदा करेगा शामिल करने के लिए की जरूरत है।

mkdir build 
cd build 
cmake .. 
make 

फिर आप के साथ ./MyProject (arguments)

संपादित 2

CMake साथ Caffe निर्माण की आवश्यकता संतोषजनक अपने कार्यक्रम चला सकते हैं यह काम करने के लिए बहुत महत्वपूर्ण है। आपको सीएमके का उपयोग करके मेकफ़ाइल को कॉन्फ़िगर और उत्पन्न करने की आवश्यकता है। cmake-gui या ccmake का उपयोग इस उद्देश्य के लिए, ताकि आप CPU_ONLY की तरह अपने विकल्पों, आदि

आप एक निर्माण निर्देशिका Caffe के अंदर बना सकते हैं और एक बुनियादी सेटअप

mkdir build 
cd build 
cmake .. 
make -jX #X is the number of threads your CPU can handle 

के लिए निम्नलिखित को निष्पादित करें अब, चाहिए सेट कर सकते हैं। आपके $ HOME फ़ोल्डर में cmake निर्देशिका में निम्नलिखित /home/user/.cmake/packages/Caffe/<random_string> फ़ाइल शामिल है। यह फ़ाइल कैफी के इंस्टॉल स्थान को इंगित करती है (जो हमारी बिल्ड निर्देशिका है)

अब, find_package कमांड को आपकी अन्य परियोजनाओं के लिए त्रुटियों के बिना चलाना चाहिए। और चूंकि आप CMake उपयोग कर रहे हैं आप Caffe फ़ोल्डर के बाहर अपनी परियोजना फ़ोल्डर रख सकते है (और यह यह बाहर रखने के लिए Caffe के मेकअप प्रक्रिया के रूप में आपकी फ़ाइलों का निर्माण करने की कोशिश करेंगे बेहतर है, लेकिन यह असफल हो जायेगी)

नोट: यदि त्रुटि बनी रहती है, तो आप cmake कॉन्फ़िगरेशन के दौरान मैन्युअल रूप से Caffe_DIR सेट कर सकते हैं।

+0

इससे बहुत मदद मिलती है, मेरे पास एक समस्या यह है कि मेरे पास एक मुख्य.cpp प्रोग्राम और दो अन्य वर्ग हैं जो स्वयं की सीपीपी फाइलों (और संबंधित हेडर फाइलें) में हैं। क्या आप किसी भी तरह से आसान तरीके से जानते हैं जहां मुझे दो अन्य फाइलों को संकलित करने के लिए भी मिल सकता है? –

+1

उनमें से प्रत्येक के लिए मेकफ़ाइल/CMakeLists.txt लिखने का सबसे अच्छा तरीका है, उन्हें ऑब्जेक्ट्स में संकलित करें और इसे निर्भरता के साथ main.cpp से लिंक करें। निर्भरताओं को जानने के लिए, आप Makefile.config में सुंदर प्रिंट बंद कर सकते हैं और कैफे की प्रक्रिया प्रक्रिया में उदाहरण/टूल को संकलित करने के लिए पास किए गए झंडे देख सकते हैं। और हाँ, मैं नहीं सोच सकता कि इसे आसान तरीके से कैसे किया जा सकता है। शायद अगर मुझे बाद में पता चल जाए, तो मैं आपको पिंग कर दूंगा। – ImgPrcSng

+0

उस महान स्पष्टीकरण के लिए धन्यवाद! एक बात मैं इसके बारे में थोड़ा उलझन में हूं कि कैसे सेमेक कैफे पाता है? निर्देश "find_package (कैफे आवश्यक)" या "$ {Caffe_LIBRARIES}" यह नहीं बताता कि लाइब्रेरी कहां है। एक बार जब मैंने अपने कंप्यूटर पर कैफे को संकलित किया है, तो क्या मैंने इसे सेमेक को इंगित करने के लिए अतिरिक्त जानकारी देने के लिए किया था जहां यह पुस्तकालय हैं? –

1

Makefile.config बदलें CPU_ONLY := 1

# CPU-only switch (uncomment to build without GPU support). 
CPU_ONLY := 1 
संबंधित मुद्दे