Объявление массивов без начального размера - PullRequest
4 голосов
/ 30 марта 2009

Я пытаюсь скомпилировать привязки Python для OpenSSL (pyOpenSSL) в Windows Vista x64 с использованием Visual Studio 2008. Когда я запускаю python setup.py build_ext -I C:\OpenSSL\include, он умирает со следующей ошибкой:

building 'OpenSSL.crypto' extension
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -I\OpenSSL\include -IC:\Python26\include -IC:\Python26\PC /Tcsrc/crypto/x509name.c /Fobuild\temp.win-amd64-2.6\Release\src/crypto/x509name.obj
x509name.c
src/crypto/x509name.c(16) : error C2133: 'crypto_X509Name_methods' : unknown size
error: command '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe"' failed with exit status 2

Когда я смотрю на рассматриваемый источник, в строке 16 я вижу следующее:

static PyMethodDef crypto_X509Name_methods[];

Мой С очень ржавый, поэтому я не помню, можете ли вы это сделать или нет. Поскольку это библиотека Python, я думаю, она написана для компиляции в gcc, но на этом компьютере не установлена ​​среда Cygwin. Есть ли какой-нибудь ключ, который я могу использовать, чтобы заставить этот код компилироваться с VS2008?

Ответ:

Позже в коде есть это:

/*
 * ADD_METHOD(name) expands to a correct PyMethodDef declaration
 *   {  'name', (PyCFunction)crypto_X509_name, METH_VARARGS }
 * for convenience
 */
#define ADD_METHOD(name)        \
    { #name, (PyCFunction)crypto_X509Name_##name, METH_VARARGS,  crypto_X509Name_##name##_doc }
static PyMethodDef crypto_X509Name_methods[] =
{
    ADD_METHOD(hash),
    ADD_METHOD(der),
    ADD_METHOD(get_components),
    { NULL, NULL }
};
#undef ADD_METHOD

Исходя из предложения Нила Баттерворта, я по ошибке изменил строку с:

static PyMethodDef crypto_X509Name_methods[];

до:

static PyMethodDef crypto_X509Name_methods[4];

и код скомпилирован.

Спасибо всем.

Ответы [ 2 ]

5 голосов
/ 30 марта 2009

У вас, вероятно, такая ситуация:

#include <stdio.h>

static int a[];     // declaration

// lots of code

int a[3];           // use

, который компилируется как C с gcc. Я не уверен, что это должно (это не является допустимым C ++), но мне не хватает юриста по языку C, чтобы сказать вам наверняка.

5 голосов
/ 30 марта 2009

Поскольку он статический, он должен быть инициализирован с постоянным размером в некоторой единице компиляции (исходный файл C).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...