2013-08-01 119 views
1

我需要幫助!C和C++ ---未定義的參考

我在接下來的路徑實現的一個.cpp程序:家用/弗吉尼亞州/安卓/ VLC/src目錄/輸入/ virtual.cpp

/* 
    * virtual.cpp 
    */ 
    #include <stdlib.h> 

    #include <jni.h> 
    #include <math.h> 

    #include <opencv2/core/core.hpp> 
    #include <opencv2/imgproc/imgproc.hpp> 
    #include <opencv2/imgproc/types_c.h> 
    #include <opencv2/highgui/highgui_c.h> 
    #include <opencv2/photo/photo.hpp> 

    #include <android/log.h> 

    extern "C" { 
     #include "virtual.h" 
    } 
    #define LOG_TAG "VLC - Imagen 3D - JNI" 
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) 
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) 

    using namespace cv; 
    using namespace std; 

    extern "C" int camino(void){... } 

此程序調用OpenCV的功能。

virtual.h(家庭/弗吉尼亞州/安卓/ VLC/src目錄/輸入/ virtual.h)

/* 
* virtual.h 
*/ 
    #ifndef __VIRTUAL_H 
    #define __VIRTUAL_H 

    int camino(void); 

    #endif /*__VIRTUAL_H*/ 

但問題是,我需要調用 「卡米諾」 功能從decoder.c( (家庭/弗吉尼亞州/安卓/ VLC/src目錄/輸入/ decoder.c):

#include "virtual.h" 

#ifdef HAVE_CONFIG_H 
# include "config.h" 
#endif 
#include <assert.h> 

... 
static void DecoderPlayVideo(decoder_t *p_dec, picture_t *p_picture, 
           int *pi_played_sum, int *pi_lost_sum){ 

... 
      int res = camino(); 
      msg_Warn(p_dec, "Llamada a virtualJNI devuelve %d", &res); 
      vout_PutPicture(p_vout, p_picture); 
... 
} 
... 

,我發現了一個錯誤:

/home/virginia/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ../vlc/android/src/.libs/libvlccore.a(decoder.o): in function DecoderDecodeVideo:../../src/input/decoder.c:1501: error: undefined reference to 'camino' 
collect2: ld returned 1 exit status 
make[1]: *** [obj/local/armeabi-v7a/libvlcjni.so] Error 1 
make[1]: Leaving directory `/home/virginia/android/vlc-android' 
make: *** [vlc-android/obj/local/armeabi-v7a/libvlcjni.so] Error 2 

我在做什麼WRO NG?非常感謝

+2

爲什麼在定義中有'extern「C」'? –

+0

您應該首先決定是否使用C或C++進行編程。然後按照該語言的約定。例如,在C++中,你不寫'int camino(void);',而是'int camino();'。我甚至不知道前者是否有效 - 你只是不會寫這個。 –

+3

把void放在那裏沒有錯。在C++中它不被認爲是很好的風格,我不這樣做,但它沒有錯。 –

回答

2

關於extern "C"的東西,但不建議這樣做:

extern "C" { 
    #include "virtual.h" 
} 

相反,你應該把它的頭:

/* 
* virtual.h 
*/ 
    #ifndef __VIRTUAL_H 
    #define __VIRTUAL_H 

    #ifdef __cplusplus 
    extern "C" { 
    #endif 

    int camino(); 

    #ifdef __cplusplus 
    } 
    #endif 

    #endif /*__VIRTUAL_H*/ 

你會看到這一點幾乎所有意味着在C和C++之間共享的頭文件。

至於你真正的問題,你將不得不向我們展示實際的鏈接器命令,而不僅僅是錯誤,但它看起來像virtual.o沒有被鏈接到你的程序,並可能沒有被構建。

+0

我已經更改了頭文件virtual.h。 我知道這是鏈接器錯誤,但我有一些文件,我不知道如何鏈接opencv庫。 Compile.sh文件:https://github.com/mstorsjo/vlc-android/blob/master/compile.sh Makefile文件:https://github.com/mstorsjo/vlc-android/blob/master/ Makefile configure.sh文件:https://github.com/mstorsjo/vlc-android/blob/master/configure.sh – VirMarGu

+0

在configure.sh中,我修改了下一行: CPPFLAGS =「 - I $ { ANDROID_NDK}/sources/cxx-stl/gnu-libstdC++ $ {CXXSTL}/include -I $ {ANDROID_NDK}/sources/cxx-stl/gnu-libstdC++ $ {CXXSTL}/libs/$ {ANDROID_ABI}/include -I/usr/local/lib「 LDFLAGS =」$ LDFLAGS -L $ {ANDROID_NDK}/sources/cxx-stl/gnu-libstdC++ $ {CXXSTL}/libs/$ {ANDROID_ABI} -L/usr/local/lib「 感謝您的幫助! – VirMarGu