2013-08-01 91 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