c++ - 如何使用包装器从 Swift 调用 C++ 函数并使用终端进行编译?

标签 c++ swift

这是我的 C++ 代码:

#include<stdio.h>
#include<string.h>
#include "agg-2.5/include/agg_rendering_buffer.h"
#include "r_buffer.h"
enum{
  frame_width = 320,
  frame_height = 200
};

bool write_ppm(const unsigned char* buf,
                unsigned width,
                unsigned height,
                const char* file_name)
                {
                  FILE* fd = fopen(file_name, "wb");
                  if(fd){
                    fprintf(fd, "P6 %d %d 255 ", width, height);
                    fwrite(buf, 1, width*height*3, fd);
                    fclose(fd);
                    return true;
                  }
                  return false;
                }

void draw_black_frame(agg::rendering_buffer& rbuf){
  unsigned i;
  for(i = 0; i<rbuf.height();i++){
    unsigned char* p = rbuf.row_ptr(i);
    *p++ = 0; *p++ = 0; *p++ = 0;
    p += (rbuf.width() - 2)*3;
    *p++ = 0; *p++ = 0; *p++ = 0;
  }
  memset(rbuf.row_ptr(0), 0, rbuf.width()*3);
  memset(rbuf.row_ptr(rbuf.height()-1), 0, rbuf.width()*3);
}

void start_func() {

  unsigned char* buffer = new unsigned char[frame_width*frame_height*3];

  memset(buffer, 255, frame_width*frame_height*3);

  agg::rendering_buffer rbuf(buffer,
                            frame_width,
                            frame_height,
                            frame_width*3);

  unsigned i;
  for(i = 0; i<rbuf.height()/2;++i){
    unsigned char* ptr = rbuf.row_ptr(i) + i*3;

    *ptr++ = 127;// R
    *ptr++ = 200;// B
    *ptr++ = 98; // G
  }

  draw_black_frame(rbuf);
  write_ppm(buffer, frame_width, frame_height, "agg_test.ppm");

  delete [] buffer;

}

r_buffer.h

extern "C" {
  void start_func();
}

桥.h

#include "r_buffer.h"

swift_r_buffer.swift

start_func();

我尝试按如下方式编译它:

swiftc swift_r_buffer.swift -import-objc-header bridge.h

但我收到此错误:

/home/karthik/agg_eg/bridge.h:1:10: note: in file included from /home/karthik/agg_eg/bridge.h:1:
#include "r_buffer.h"
         ^
/home/karthik/agg_eg/./r_buffer.h:1:8: error: expected identifier or '('
extern "C" {
       ^
1 error generated.
<unknown>:0: error: failed to emit precompiled header '/tmp/bridge-238ccd.pch' for bridging header 'bridge.h'
<unknown>:0: error: generate-pch command failed with exit code 1 (use -v to see invocation)

我该如何解决这个问题?我使用的是 Ubuntu 18.04 LTS。

最佳答案

桥必须采用 C 语言,因此您需要 extern "C" 指令以目标为 C++ 为条件。
像这样的事情:

#ifdef __cplusplus
extern "C" {
#endif

  void start_func(void);

#ifdef __cplusplus
}
#endif

关于c++ - 如何使用包装器从 Swift 调用 C++ 函数并使用终端进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54961018/

相关文章:

c++ - 在硬件应用程序中使用共享内存 (C++) 时需要互斥锁

java - 如何使用 JNA 在 Java 中传递包含 char* 的结构并避免数据复制?

ios - 在 Firebase 中迭代快照子项

c++ - 在 Visual Studio 中使用内联变量

c++ - 在表达式 bool << integer 中,bool 是提升为 int,还是提升为与整数相同的类型?

c++ - 在 C++ API 中将一个张量的一大块复制到另一个张量中

objective-c - 将可选的 JSON 从 react-native 传递给 Swift

arrays - 从数组中删除一些元素

ios - touchesBegan方法中发生双击时如何防止调用单击

swift - 订阅返回 Void 而不是 AnyCancelable