Не устарел ли SWIG for go после удаления некоторого C на Голанге?

Я пытался создать оболочку Go для open-vcdiff поэтому я впервые взглянул на SWIG со следующей попыткой:

godelta.swig

%module godelta
%include "include/godelta.hpp"

godelta.hpp

#include "config.h"#include <assert.h>
#include <errno.h>
#ifdef WIN32
#include <fcntl.h>
#include <io.h>
#endif  // WIN32
#include <stdio.h>
#include "google/vcdecoder.h"#include "google/vcencoder.h"#include "google/jsonwriter.h"#include "google/encodetable.h"#include "unique_ptr.h" // auto_ptr, unique_ptr

#ifndef HAS_GLOBAL_STRING

#endif  // !HAS_GLOBAL_STRING

static const size_t kDefaultMaxTargetSize = 1 << 26;      // 64 MB

namespace godelta {

class Godelta {
public:
Godelta();
~Godelta();

bool Encode();
bool Decode();
bool DecodeAndCompare();

int opt_buffersize;
int opt_max_target_window_size;
int opt_max_target_file_size;

private:
input file
static bool FileSize(FILE* file, size_t* file_size);
bool OpenFileForReading(const string& file_name,
const char* file_type,
FILE** file,
std::vector<char>* buffer);
bool OpenDictionary();
bool OpenInputFile() {
return OpenFileForReading(input_file_name_,
input_file_type_,
&input_file_,
&input_buffer_);
}

bool OpenOutputFile();
bool OpenOutputFileForCompare() {
return OpenFileForReading(output_file_name_,
output_file_type_,
&output_file_,
&compare_buffer_);
}

bool ReadInput(size_t* bytes_read);
bool WriteOutput(const string& output);
bool CompareOutput(const string& output);

std::vector<char> dictionary_;

UNIQUE_PTR<open_vcdiff::HashedDictionary> hashed_dictionary_;

const char* input_file_type_;
const char* output_file_type_;

string input_file_name_;
string output_file_name_;

FILE* input_file_;
FILE* output_file_;

std::vector<char> input_buffer_;
std::vector<char> compare_buffer_;

Godelta(const Godelta&);  // NOLINT
void operator=(const Godelta&);
};

} // namespace godelta

Swig работает хорошо, генерируя файлы godelta_wrap.cxx, godelta_gc.c а также godelta.go, Проблема, с которой я сталкиваюсь сейчас, заключается в том, что она генерирует include:

#include "runtime.h"#include "cgocall.h"

В результате ошибка:

godelta_gc.c:2:10: fatal error: 'runtime.h' file not found

Я везде искал этот файл, даже искал репозиторий Go на GitHub. Я нахожу только то, что кажется заменой этого файла в Go.

Кстати, моя версия Go:

go version go1.9 darwin/amd64

Clang:

Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

И SWIG:

SWIG Version 3.0.12
Compiled with g++ [x86_64-apple-darwin16.7.0]
Configured options: +pcre

Любое понимание предмета будет высоко ценится, особенно если это приводит к тому, что я могу бежать go build на упаковке без этой ошибки 🙂

1

Решение

Похоже, мне не хватало флага в моей команде Swig. Моя оригинальная команда выглядела так:

swig -go -intgosize 64 godelta.swig

Но, как указано на вопрос Я в конечном итоге подал, я должен был включить -c++ а также -cgo заканчивая с:

swig -c++ -go -cgo -intgosize 64 godelta.swig

Теперь работает нормально 🙂

2

Другие решения

Других решений пока нет …