2015-09-09 4 views
5

मैं लाइब्रेरी को जोड़ने के लिए सीएमके का उपयोग करने का प्रयास कर रहा हूं (BNO055 Driver)। चूंकि बीएनओ055 चालक सीएमके का उपयोग नहीं करता है और इसे लगभग एक साल तक नहीं बदला गया है, मैंने केवल स्रोत फाइलों को डाउनलोड करने और उन्हें अपनी परियोजना में रखने का फैसला किया है।सीएमके "फ़ंक्शन के लिए अनिर्धारित संदर्भ"

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

मुद्दा यह है कि लिंक काम नहीं कर रहा है। जब मैं प्रोजेक्ट संकलित करता हूं तो मुझे undefined reference to <function> त्रुटि मिलती है, जहां <function> BNO055 ड्राइवर द्वारा परिभाषित एक फ़ंक्शन है।

क्या मैं पुस्तकालय को गलत तरीके से बना रहा हूं या जोड़ रहा हूं?
क्या मुझे इन कार्यों को परिभाषित करने के लिए कुछ और करने की ज़रूरत है?

कोड के 200 लाइनों में चिपकाने नहीं के लिए, यहाँ एक सरल main.cpp कि असली main.cpp रूप में एक ही त्रुटि पैदा करता है। आप असली main.cpp Github रेपो के लिए लिंक bellow का पालन

#include "bno055.h" 
#include "mraa.hpp" 

struct bno055_t bno055; 
mraa::I2c *i2c(0); 

int main() { 
    bno055_init(&bno055); 
    i2c->address(0x29); 
} 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.4) 
project(imc-server) 

# CMake 
# -- Config 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread") 

# Global 
# -- Include 
include(ExternalProject) 

# BNO055 
# -- Include 
include_directories(${CMAKE_SOURCE_DIR}/bno055) 

set(SOURCE_FILES ${SOURCE_FILES} 
     ${CMAKE_SOURCE_DIR}/bno055/bno055.h 
     ${CMAKE_SOURCE_DIR}/bno055/bno055.c) 

# MRAA 
# -- Build 
externalProject_add(mraa 
     GIT_REPOSITORY https://github.com/intel-iot-devkit/mraa.git 
     GIT_TAG  v0.7.5 
) 

# Compile 
# -- Source 
set(SOURCE_FILES ${SOURCE_FILES} 
     main.cpp) 

# -- Create 
add_executable(imc-server ${SOURCE_FILES}) 
add_dependencies(imc-server mraa) 

के प्रासंगिक भाग को देखने के लिए चाहते हैं, तो लॉग

[ 90%] Linking CXX executable imc-server 
CMakeFiles/imc-server.dir/test.cpp.o: In function `main': 
/home/noah/Documents/Inertial-Motion-Capture/imc-server/test.cpp:8: undefined reference to `bno055_init(bno055_t*)' 
CMakeFiles/imc-server.dir/test.cpp.o: In function `mraa::I2c::address(unsigned char)': 
/usr/local/include/mraa/i2c.hpp:99: undefined reference to `mraa_i2c_address' 
collect2: error: ld returned 1 exit status 
make[2]: *** [imc-server] Error 1 
make[1]: *** [CMakeFiles/imc-server.dir/all] Error 2 
make: *** [all] Error 2 

बिल्ड Project Github (39a6196)
Build Log

+0

आप '$ {का उपयोग करें:

मुझे लगता है कि इतनी तरह एक extern "C" {} ब्लॉक में एक समारोह एक सी कार्यक्रम में परिभाषित किया गया उपयोग करने के लिए, एक C++ प्रोग्राम, आप है रैप करने के लिए सी पुस्तकालय के शामिल सीखा 'Bno055' लाइब्रेरी बनाने के लिए CMAKE_SOURCE_DIR}/bno055/bno055.c' फ़ाइल, इसलिए आपको उस फ़ाइल का उपयोग 'imc-server' निष्पादन योग्य बनाने के लिए नहीं करना चाहिए। साथ ही, निष्पादन योग्य लिंक के लिए लाइब्रेरी लक्ष्य नाम का उपयोग करना बेहतर है: 'target_link_libraries (imc-server bno055)'। बाहरी परियोजना 'मरा' के लिए, आपको अतिरिक्त लक्ष्य निर्भरता की आवश्यकता है ताकि इसके साथ सही तरीके से लिंक किया जा सके: 'add_dependencies (imc-server mraa)'। – Tsyvarev

+0

@Tsyvarev ठीक है, मैंने बस निष्पादन योग्य में BNO055 फ़ाइलों को जोड़ा (इसलिए कोई lib या bno055 के लिए लिंक नहीं)। हालांकि मुझे अभी भी अपरिभाषित फ़ंक्शन त्रुटियां मिल रही हैं। मैंने सभी मरा कोड को भी असम्बद्ध किया और मुझे उन कार्यों के लिए अपरिभाषित फ़ंक्शन त्रुटियां भी मिल रही हैं। क्या मैं कुछ मौलिक रूप से यहां लापता हूं? [परिवर्तन के साथ प्रतिबद्ध => 39a6196] (https://github.com/Noah-Huppert/Inertial-Motion-Capture/tree/39a6196e48623c76323b92d37bf6e811c22f3ad5/imc-server) –

+0

त्रुटि मिलने पर कौन सा स्रोत संकलित किया जा रहा है? सटीक त्रुटि संदेश (कम से कम, एक फ़ंक्शन के लिए) सहायक होगा। – Tsyvarev

उत्तर

4

पाए जाते हैं शामिल समस्या यह है कि BNO055 पुस्तकालय सी में लिखा गया था, और मेरे कार्यक्रम सी ++ में लिखा गया था था।

extern "C" { 
    #include "bno055.h" 
} 
#include "mraa.hpp" 

struct bno055_t bno055; 
mraa::I2c *i2c(0); 

int main() { 
    bno055_init(&bno055); 
    i2c->address(0x29); 
} 
0

अपने SOURCE_FILES से शीर्षलेख निकालें।

set(SOURCE_FILES ${SOURCE_FILES} 
     # ${CMAKE_SOURCE_DIR}/bno055/bno055.h 
     ${CMAKE_SOURCE_DIR}/bno055/bno055.c) 

सीएमके को स्वयं ही आवश्यक हेडर ढूंढना चाहिए। अतिरिक्त द्वारा include_directories

+1

मुद्दा यह था कि मुझे bno055 को लपेटना पड़ा था जिसमें ' बाहरी "सी" {} "' –

+0

शायद आप अपना उत्तर पोस्ट कर सकते हैं, यह और अधिक दिखाई देगा – lelloman

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