首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C和C++ -未定义的引用

C和C++ -未定义的引用
EN

Stack Overflow用户
提问于 2013-08-01 23:29:54
回答 1查看 2.1K关注 0票数 1

我需要帮助!

我已经在下一个路径中实现了一个.cpp程序: home/virginia/android/vlc/src/input/virtual.cpp

代码语言:javascript
运行
复制
    /*
    *  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函数。

虚拟.h( home/virginia/android/vlc/src/input/virtual.h)

代码语言:javascript
运行
复制
/*
* virtual.h
*/
    #ifndef __VIRTUAL_H
    #define __VIRTUAL_H

    int camino(void);

    #endif /*__VIRTUAL_H*/

但问题是我需要从decder.c (( home/virginia/android/vlc/src/input/decoder.c):))调用"camino“函数

代码语言:javascript
运行
复制
#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 );
...
}
...

我得到了下一个错误:

代码语言:javascript
运行
复制
/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

我做错了什么?非常感谢

EN

回答 1

Stack Overflow用户

发布于 2013-08-01 23:52:20

关于extern "C"的东西,不推荐这样做:

代码语言:javascript
运行
复制
extern "C" {
   #include "virtual.h"
}

相反,你应该把它放在头中:

代码语言:javascript
运行
复制
/*
* 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没有链接到你的程序中,而且可能没有被构建。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17998338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档