Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在.cpp内调用.c文件_C++_C_Raspbian - Fatal编程技术网

C++ 在.cpp内调用.c文件

C++ 在.cpp内调用.c文件,c++,c,raspbian,C++,C,Raspbian,我试图从C++文件(main .cp)调用C文件(DISMUNX.C)。< /P> dispmanx.c: #ifdef __cplusplus extern "C" { #endif #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <assert.h> #include <unistd.h> #include <sys/time.h>

我试图从C++文件(main .cp)调用C文件(DISMUNX.C)。< /P> dispmanx.c:

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
#include <unistd.h>
#include <sys/time.h>

#include "bcm_host.h"

#define WIDTH   200
#define HEIGHT  200

#ifndef ALIGN_UP
#define ALIGN_UP(x,y)  ((x + (y)-1) & ~((y)-1))
#endif

int run(unsigned char* fileData)
{
    typedef struct
    {
        DISPMANX_DISPLAY_HANDLE_T   display;
        DISPMANX_MODEINFO_T         info;
        void                       *image;
        DISPMANX_UPDATE_HANDLE_T    update;
        DISPMANX_RESOURCE_HANDLE_T  resource;
        DISPMANX_ELEMENT_HANDLE_T   element;
        uint32_t                    vc_image_ptr;

    } RECT_VARS_T;

    static RECT_VARS_T  gRectVars;


    RECT_VARS_T    *vars;
    uint32_t        screen = 1;
    int             ret;
    VC_RECT_T       src_rect;
    VC_RECT_T       dst_rect;
    VC_IMAGE_TYPE_T type = VC_IMAGE_RGB565;
    int width = WIDTH, height = HEIGHT;
    int pitch = ALIGN_UP(width*2, 32);
    int aligned_height = ALIGN_UP(height, 16);
    VC_DISPMANX_ALPHA_T alpha = { DISPMANX_FLAGS_ALPHA_FROM_SOURCE | DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, 
                             120, /*alpha 0->255*/
                             0 };

    vars = &gRectVars;

    bcm_host_init();

    printf("Open display[%i]...\n", screen );
    vars->display = vc_dispmanx_display_open( screen );

    ret = vc_dispmanx_display_get_info( vars->display, &vars->info);
    assert(ret == 0);
    printf( "Display is %d x %d\n", vars->info.width, vars->info.height );

    vars->image = fileData;

//  vars->image = calloc(1, pitch * height);
    assert(vars->image);

    vars->resource = vc_dispmanx_resource_create( type,
                                                  width,
                                                  height,
                                                  &vars->vc_image_ptr );
    assert( vars->resource );
    vc_dispmanx_rect_set( &dst_rect, 0, 0, width, height);
    ret = vc_dispmanx_resource_write_data(  vars->resource,
                                            type,
                                            pitch,
                                            vars->image,
                                            &dst_rect );


    assert( ret == 0 );
    vars->update = vc_dispmanx_update_start( 10 );
    assert( vars->update );

    vc_dispmanx_rect_set( &src_rect, 0, 0, width << 16, height << 16 );

    vc_dispmanx_rect_set( &dst_rect, ( vars->info.width - width ) / 2,
                                     ( vars->info.height - height ) / 2,
                                     width,
                                     height );

    vars->element = vc_dispmanx_element_add(    vars->update,
                                                vars->display,
                                                2000,               // layer
                                                &dst_rect,
                                                vars->resource,
                                                &src_rect,
                                                DISPMANX_PROTECTION_NONE,
                                                &alpha,
                                                NULL,             // clamp
                                                VC_IMAGE_ROT0 );

    ret = vc_dispmanx_update_submit_sync( vars->update );
    assert( ret == 0 );

    printf( "Sleeping for 10 seconds...\n" );
    sleep( 10 );

    vars->update = vc_dispmanx_update_start( 10 );
    assert( vars->update );
    ret = vc_dispmanx_element_remove( vars->update, vars->element );
    assert( ret == 0 );
    ret = vc_dispmanx_update_submit_sync( vars->update );
    assert( ret == 0 );
    ret = vc_dispmanx_resource_delete( vars->resource );
    assert( ret == 0 );
    ret = vc_dispmanx_display_close( vars->display );
    assert( ret == 0 );

    return 0;
}

#ifdef __cplusplus
}
#endif
但是当我尝试编译main.cpp时:

#include "dispmanx.c"


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main()
{
    Mat image;
    image = imread("t.png", IMREAD_COLOR);   // Read the file
    run(image.data);
}
pi@raspberrypi:~/openCVtest.1 $ g++ -I/opt/vc/include/     -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/src/hello_pi/libs/ilclient -I/opt/vc/src/hello_pi/libs/vgfont -L/opt/vc/lib/ -L/opt/vc/src/hello_pi/libs/ilclient -L/opt/vc/src/hello_pi/libs/vgfont -c main.cpp dispmanx.o  -o main.o -lbrcmGLESv2 -lbrcmEGL -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lpthread -lrt -lm               In file included from main.cpp:2:0:
dispmanx.c:在函数“int run(unsigned char*)”中: dispmanx.c:52:68:错误:从'int'到'dispmanx_FLAGS_ALPHA_T'[-fppermissive]的转换无效 VC_DISPMANX_ALPHA_T ALPHA={DISPMANX_FLAGS_ALPHA_FROM_SOURCE | DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

dispmanx.c:111:63: error: cannot convert ‘VC_IMAGE_TRANSFORM_T’ to ‘DISPMANX_TRANSFORM_T’ for argument ‘10’ to ‘DISPMANX_ELEMENT_HANDLE_T vc_dispmanx_element_add(DISPMANX_UPDATE_HANDLE_T, DISPMANX_DISPLAY_HANDLE_T, int32_t, const VC_RECT_T*, DISPMANX_RESOURCE_HANDLE_T, const VC_RECT_T*, DISPMANX_PROTECTION_T, VC_DISPMANX_ALPHA_T*, DISPMANX_CLAMP_T*, DISPMANX_TRANSFORM_T)’
                                             VC_IMAGE_ROT0 );
我已经分别测试了程序和函数,但是当我尝试混合它们时,我得到了我无法理解的错误


我是一名具有初级知识水平的学生。我做错了什么?

鉴于
dispmanx.c
的这些内容:

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
#include <unistd.h>
#include <sys/time.h>
你会有严重的问题

您已经封装了所有的标准头文件,如<代码> UNISTD .H./C> >代码>外部“C”<代码>,然后<代码>包含了<代码> > C++文件> < /P>

它们不适用于C++代码中的那种方式。

<代码>包含<文件>(源代码文件>代码> C代码/代码>代码> .CPP <代码>等)首先是一个根本的坏主意.用不同的语言(例如C和C++)来做,然后用“代码>外部”C不正确包装系统标题.更糟。你不能安全编译C代码作为C++代码,当然不能用C++代码包系统头文件,使用C++代码。


<>代码>外部“C”/COD>不安全地编译C代码与C++编译器。它们是不同的语言,具有细微的区别。

< P>给出了这些内容<代码> DISMUNX.C.<代码>:

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
#include <unistd.h>
#include <sys/time.h>
你会有严重的问题

您已经封装了所有的标准头文件,如<代码> UNISTD .H./C> >代码>外部“C”<代码>,然后<代码>包含了<代码> > C++文件> < /P>

它们不适用于C++代码中的那种方式。

<代码>包含<文件>(源代码文件>代码> C代码/代码>代码> .CPP <代码>等)首先是一个根本的坏主意.用不同的语言(例如C和C++)来做,然后用“代码>外部”C不正确包装系统标题.更糟。你不能安全编译C代码作为C++代码,当然不能用C++代码包系统头文件,使用C++代码。 <>代码>外部“C”/COD>不安全地编译C代码与C++编译器。它们是不同的语言,具有细微的区别。

< P>问题在这里:

#include "dispmanx.c"
包含< <代码> *.c>文件> <代码> *.CPP文件不是一个好主意。C和C++是类似的语言,因此它可能看起来它首先工作(即编译器不在第1行而是在第111行报告错误),但实际上它没有。

< >从C++代码调用C代码的一种正确方法是提供这样的声明:

// C++ code
#include <iostream>

extern "C" {
    int run(unsigned char* fileData); // declaration for the C code
}

...
int main()
{
    ...
    run(image.data); // calling the C code
}
//main.cpp
#包括
#包括“dispmanx.h”
...
int main()
{
...
运行(image.data);//调用C代码
}

另一个约定:如果你想在C和C++中编译新的<代码> DISMUNX.H./<代码文件,你应该把C代码>外部“C”< /C>部分从C编译器中隐藏起来,如

< P>问题在这里:

#include "dispmanx.c"
包含< <代码> *.c>文件> <代码> *.CPP文件不是一个好主意。C和C++是类似的语言,因此它可能看起来它首先工作(即编译器不在第1行而是在第111行报告错误),但实际上它没有。

< >从C++代码调用C代码的一种正确方法是提供这样的声明:

// C++ code
#include <iostream>

extern "C" {
    int run(unsigned char* fileData); // declaration for the C code
}

...
int main()
{
    ...
    run(image.data); // calling the C code
}
//main.cpp
#包括
#包括“dispmanx.h”
...
int main()
{
...
运行(image.data);//调用C代码
}

另外一个约定:如果你想在C和C++中编译你的新的<代码> DISMUNX.H./Cux>文件,你应该隐藏<代码>外部“C”C编译器的一部分,如中所述。

您可能希望显示
dispmanx.C
中第111行的位置。可以计数到111并找到它,但最好通过标记//错误在此处或类似的内容来让读者更容易阅读。您可以通过提问来完成此操作。您可能希望显示
dispmanx.C中第111行的位置
是。可以数到111并找到它,但最好通过标记//错误在这里或类似的东西来让读者更容易理解。你可以用你的问题来回答。公平地说,这些都是C标题,可能有
#ifdef
/
外部的“C”
它们自己的组合谢谢你提供了非常有用的信息,如果用extern“c”包装不是一个好方法,你建议如何解决我的问题?如果我为dispmanx.c创建一个main方法,并尝试为我的cpp代码(包含OpenCV库)包装,这会是一个更好的选择吗@ LexNexraceSeNeRealSnk,但从注释“代码”开始,在C++ iOFFROW的顶部定义ISO C STDIO。< /代码>我不想通过这样的方法来找出用“代码>外部”C包装的东西。<代码>当包含在C++源文件中时,@安德烈斯勒不知道该评论在那里做什么,但是它是难以置信的,GLUBC/IO是C++标准库的IOFROM的包装器。@ Ben你用C编译器编译C++代码,C++代码,C++编译器,比你可以把它们链接在一起。这些都是C头,可能有自己的
#ifdef
/
extern“C”
组合谢谢你提供了非常有用的信息,如果用extern“C”包装不是一个好方法,你建议如何解决我的问题?如果我为dispmanx.C创建一个main方法并尝试为我的cpp代码包装,这会是一个更好的选择吗(包含OpenCV库)?@ LealNexraceSeNeRe纲,但从注释<代码>开始定义C++ IOFSWORT之上的ISO C STDIO。< /代码>我不会试图弄清楚什么是包装的东西。
// main.cpp
#include <iostream>
#include "dispmanx.h"
...
int main()
{
    ...
    run(image.data); // calling the C code
}