C++ 在Windows-visualstudio中运行PBC

C++ 在Windows-visualstudio中运行PBC,c++,visual-studio-2013,cryptography,C++,Visual Studio 2013,Cryptography,我已经在Windows8.1上的VisualStudio2013更新3中找到了正确的头文件(我刚刚修改了Linux的现有头文件) 但是,当我尝试使用这些头编译一段代码时,会出现以下错误: 1>PBC_sig.obj : error LNK2001: unresolved external symbol @__gmpz_clear@4 1>PBC_sig.obj : error LNK2001: unresolved external symbol @__gmpz_init@4 1

我已经在Windows8.1上的VisualStudio2013更新3中找到了正确的头文件(我刚刚修改了Linux的现有头文件)

但是,当我尝试使用这些头编译一段代码时,会出现以下错误:

1>PBC_sig.obj : error LNK2001: unresolved external symbol @__gmpz_clear@4

1>PBC_sig.obj : error LNK2001: unresolved external symbol @__gmpz_init@4

1>PBC_sig.obj : error LNK2001: unresolved external symbol @element_to_bytes_x_only@8

1>PBC_sig.obj : error LNK2001: unresolved external symbol @element_from_bytes_x_only@8
请注意,我想静态链接PBC.lib(由上面的Linux代码生成) 网站(借助MinGW和MSYS windows编译器)

从上面的错误中,我很清楚静态链接过程有问题,但我不明白我能做些什么来修复它们。(我已经将标题放在VS自己的文件夹中,将PBC.lib放在VS自己的文件夹中。)如果您还不知道,PBC使用,上面的前两个错误就是从中产生的。此外,在MinGW中编译PBC时,我使用了GMP的静态编译版本(在使用MinGW之前编译)


因此,我的问题是:如何修复上述错误?

很难说到底是什么错误,但这里有一个适合我的解决方案,不需要使用MingW编译:

  • 下载时,我使用了pbc-0.5.14-win32-bin.zip
  • 下载,我使用了pbc-0.5.14.tar.gz
  • 下载,我用的是gmp-4.2.2_win_lib_h.zip
  • 将pbc二进制文件解包到例如c:/libs/pbc/lib(因此该目录中的所有文件,如pbc.lib)
  • 将inlude dir从pbc源解包到例如c:/libs/pbc/include(这样所有像pbc.hin这样的文件都会被解包到该dir)
  • 正如您所做的那样,从pbc_utils.h(*)中删除
    \u属性
  • 将gmp解包到例如c:/libs/gmp(以便目录包含include、info和lib)
  • 在VS2013
  • 中创建一个新的空C++项目
  • 将Configuration->C/C++->General->Additional Include目录设置为
    C:/libs/pbc/Include;c:/libs/gmp/include;%(其他包括董事会)
  • 将配置->链接器输入设置为
    c:/libs/pbc/lib/pbc.lib
  • 添加代码,使用
    #包含
    ,生成

(*)如果成功,我建议你将此信息反馈给社区,并为pbc_utils.h提交一个适当的补丁,其中包含一些msvc没有等效属性的
\ifdef\u MSC\u VER
行(msvc对noreturn有等效属性)

很难说到底是什么错误,但这里有一个适合我的解决方案,不需要使用MingW进行编译:

  • 下载时,我使用了pbc-0.5.14-win32-bin.zip
  • 下载,我使用了pbc-0.5.14.tar.gz
  • 下载,我用的是gmp-4.2.2_win_lib_h.zip
  • 将pbc二进制文件解包到例如c:/libs/pbc/lib(因此该目录中的所有文件,如pbc.lib)
  • 将inlude dir从pbc源解包到例如c:/libs/pbc/include(这样所有像pbc.hin这样的文件都会被解包到该dir)
  • 正如您所做的那样,从pbc_utils.h(*)中删除
    \u属性
  • 将gmp解包到例如c:/libs/gmp(以便目录包含include、info和lib)
  • 在VS2013
  • 中创建一个新的空C++项目
  • 将Configuration->C/C++->General->Additional Include目录设置为
    C:/libs/pbc/Include;c:/libs/gmp/include;%(其他包括董事会)
  • 将配置->链接器输入设置为
    c:/libs/pbc/lib/pbc.lib
  • 添加代码,使用
    #包含
    ,生成

(*)如果成功,我建议你将此信息反馈给社区,并为pbc_utils.h提交一个适当的补丁,其中包含一些msvc没有等效属性的
\ifdef\u MSC\u VER
行(msvc对noreturn有等效属性)

很难说到底是什么错误,但这里有一个适合我的解决方案,不需要使用MingW进行编译:

  • 下载时,我使用了pbc-0.5.14-win32-bin.zip
  • 下载,我使用了pbc-0.5.14.tar.gz
  • 下载,我用的是gmp-4.2.2_win_lib_h.zip
  • 将pbc二进制文件解包到例如c:/libs/pbc/lib(因此该目录中的所有文件,如pbc.lib)
  • 将inlude dir从pbc源解包到例如c:/libs/pbc/include(这样所有像pbc.hin这样的文件都会被解包到该dir)
  • 正如您所做的那样,从pbc_utils.h(*)中删除
    \u属性
  • 将gmp解包到例如c:/libs/gmp(以便目录包含include、info和lib)
  • 在VS2013
  • 中创建一个新的空C++项目
  • 将Configuration->C/C++->General->Additional Include目录设置为
    C:/libs/pbc/Include;c:/libs/gmp/include;%(其他包括董事会)
  • 将配置->链接器输入设置为
    c:/libs/pbc/lib/pbc.lib
  • 添加代码,使用
    #包含
    ,生成

(*)如果成功,我建议你将此信息反馈给社区,并为pbc_utils.h提交一个适当的补丁,其中包含一些msvc没有等效属性的
\ifdef\u MSC\u VER
行(msvc对noreturn有等效属性)

很难说到底是什么错误,但这里有一个适合我的解决方案,不需要使用MingW进行编译:

  • 下载时,我使用了pbc-0.5.14-win32-bin.zip
  • 下载,我使用了pbc-0.5.14.tar.gz
  • 下载,我用的是gmp-4.2.2_win_lib_h.zip
  • 将pbc二进制文件解包到例如c:/libs/pbc/lib(因此该目录中的所有文件,如pbc.lib)
  • 将inlude dir从pbc源解包到例如c:/libs/pbc/include(这样所有像pbc.hin这样的文件都会被解包到该dir)
  • 正如您所做的那样,从pbc_utils.h(*)中删除
    \u属性
  • 将gmp解包到例如c:/libs/gmp(以便目录包含include、info和lib)
  • 在VS2013
  • 中创建一个新的空C++项目
  • 将Configuration->C/C++->General->Additional Include目录设置为
    C:/libs/pbc/Include;c:/libs/gmp/include;%(其他包括董事会)
  • 将配置->链接器输入设置为
    c:/libs/pbc/lib/pbc.lib
  • 添加代码,使用
    #包含
    ,生成
(*)如果成功的话,我建议你将此信息反馈给社区,并为pbc_utils.h提交一个适当的补丁,其中包含一些msvc没有等效属性的
\ifdef\u MSC\u VER
行(msvc对noreturn有等效属性)

因此,这里是最后一条
/*@manual log
Reports error message and exits with code 128.
*/
void pbc_die(const char *err, ...)
    __attribute__((__noreturn__))
    __attribute__((format (printf, 1, 2)));

/*@manual log
Reports informational message.
*/
void pbc_info(const char *err, ...)
    __attribute__((format (printf, 1, 2)));

/*@manual log
Reports warning message.
*/
void pbc_warn(const char *err, ...)
    __attribute__((format (printf, 1, 2)));

/*@manual log
Reports error message.
*/
void pbc_error(const char *err, ...)
    __attribute__((format (printf, 1, 2)));
/*@manual log
Reports error message and exits with code 128.
*/
#ifdef _MSC_VER

__declspec(noreturn) void pbc_die(const char *err, ...);

#else

void pbc_die(const char *err, ...)
__attribute__((__noreturn__))
__attribute__((format(printf, 1, 2)));

#endif

/*@manual log
Reports informational message.
*/
#ifdef _MSC_VER

void pbc_info(const char *err, ...);

#else

void pbc_info(const char *err, ...)
__attribute__((format(printf, 1, 2)));

#endif

/*@manual log
Reports warning message.
*/
#ifdef _MSC_VER

void pbc_warn(const char *err, ...);

#else

void pbc_warn(const char *err, ...)
__attribute__((format(printf, 1, 2)));

#endif

/*@manual log
Reports error message.
*/
#ifdef _MSC_VER

void pbc_error(const char *err, ...);

#else

void pbc_error(const char *err, ...)
__attribute__((format(printf, 1, 2)));

#endif
#pragma GCC visibility push(hidden)
// Internal:

element_ptr curve_x_coord(element_t e);
element_ptr curve_y_coord(element_t e);
element_ptr curve_a_coeff(element_t e);
element_ptr curve_b_coeff(element_t e);
element_ptr curve_field_a_coeff(field_t f);
element_ptr curve_field_b_coeff(field_t f);

void curve_from_x(element_ptr e, element_t x);
void curve_set_si(element_t R, long int x, long int y);
void curve_set_gen_no_cofac(element_ptr a);

#pragma GCC visibility pop
// Internal:

element_ptr curve_x_coord(element_t e);
element_ptr curve_y_coord(element_t e);
element_ptr curve_a_coeff(element_t e);
element_ptr curve_b_coeff(element_t e);
element_ptr curve_field_a_coeff(field_t f);
element_ptr curve_field_b_coeff(field_t f);

void curve_from_x(element_ptr e, element_t x);
void curve_set_si(element_t R, long int x, long int y);
void curve_set_gen_no_cofac(element_ptr a);