Skip to content

Latest commit

 

History

History
140 lines (100 loc) · 6.06 KB

README.md

File metadata and controls

140 lines (100 loc) · 6.06 KB

Europa从git库clone之后的VS编译指南

使用和注意事项

  1. 首先确保VS更新,同时Win10 SDK版本在10.0.19041及以上(18363未测试,不知道是否可以,也有可能),并在VS Installer-单个组件菜单中选择过nuget包管理器,才能正常通过编译。
  2. Main.cpp中的solve函数中,尽管加了两层捕捉,但是依旧存在错误情况下直接退出是因为SEH异常相关的处理存在,使得MSVC不会捕捉C系列的错误(如内存访问冲突等)。这个可以通过两种方法解决(首先搜索编译选项的启用C++异常,调整为/EHa,之后第一种方法参考微软官方Exception handling model文档,第二种方法参考注册SEH异常转化为C++异常方法
  3. 注意:这里我并不想在程序中解决这个错误。原因有两个:
    1. 首先是对于直接使用程序,即使这里使用方法捕捉到错误,出错点也不一定是被捕捉的地方,因此这里捕捉的意义也不大了
    2. Europa一般来说会作为其他组件嵌入到其他程序中,其他程序应该在调用过程中做好充足的保护,而不是让Europa做保护(反正保护了最后也会崩溃和退出),所以这部分代码应该在其他程序中写。

下面是本库针对europa的新版本VS编译指南,如想访问原来的README,请点击下方链接。

下部分内容是对于原版本europa的修改

本repo中已经做完了下面的修改,无需再次执行,可直接编译运行

Thirdparty部分

很多改动涉及引用路径和链接路径修改,这里避免了原来的使用环境变量引入,而是直接用相对目录方式引入,这部分请自行查看vcxproj文件的历史记录。

  • dlfcn在Windows+VS下不是必须的,所以可以不用考虑引入,引入的话,需要使用dlfcn下的visual-studio/12文件夹下的sln打开编译,编译前在dlfcn.c前加入一段话:(备注之下,正文第一行)
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
  • 添加log4cpp库,新版本europa要求依赖这个库
  • 引入boost库的头文件,这个在项目的nuget程序包中解决了
  • 这里请按照vcxproj文件所写的lib命名规范,提前将需要的lib文件编译出来,编译为Win32x64两种lib,然后include统一管理。
  • libantlr3c-3.4\include\antlr3convertutf.h文件中120行左右,将#define false#define true在cpp里面取消备注,也就是改成:
#ifndef __cplusplus
#define false            ANTLR3_FALSE
#define true             ANTLR3_TRUE
#endif

备用参考资料

正文部分

  • 关闭C4067 warning(莫名其妙就预处理指令有意外标记,不是很懂)
  • 关闭C5104 warning(C++20部分的某种兼容问题,太烦了关了)
  • C++——预处理器——使用标准符合性预处理器,选择为是 (/Zc:preprocessor)(为了可以正常解析europa里面神奇的define)
  • Number.hh的110行左右,取消msvc头文件里面对minmax的备注,即添加:
// MSVC define min and max in its header, so we undef them
#if _MSC_VER >= 1800

#ifdef min
#undef min
#endif

#ifdef max
#undef max
#endif

#endif
  • Resources.cc中,select2nd结构需要重新定义。
  • Types.hh中,hash_cosmpare需要引入<xhash>头文件,并且这东西被放在了stdext命名空间下;map需要加入std命名空间限定。
  • ResourceThreatManager.cc中,需要取消对max和min的定义,如下:
#ifdef max
#undef max
#endif

#ifdef min
#undef min
#endif
  • Pdlfcn.hh里添加dlfcn.h中重要的定义,在namespace之前加入,如下:
/* POSIX says these are implementation-defined.
 * To simplify use with Windows API, we treat them the same way.
 */

#define RTLD_LAZY   0
#define RTLD_NOW    0

#define RTLD_GLOBAL (1 << 1)
#define RTLD_LOCAL  (1 << 2)

/* These two were added in The Open Group Base Specifications Issue 6.
 * Note: All other RTLD_* flags in any dlfcn.h are not standard compliant.
 */

#define RTLD_DEFAULT    ((void *)0)
#define RTLD_NEXT       ((void *)-1)
  • Mutex.hh引用pthread.h之前,要加入#define HAVE_STRUCT_TIMESPEC,避免对于时间结构重定义
  • 如果修改了NDDL.g(也就是antlr文件),请去官网下载antlr3.1.3.jar编译文件,用这个对.g文件编译,然后将c扩展名改为cpp并放到VS要求的位置,就可以正常编译。

链接过程修复

需要把以下的头文件和c/cpp代码文件加入到project中,对应着现有的文件目录添加到合适目录下的Header FilesSource Files下:

  • ConstraintEngine
    • ConstraintTypeChecking.hh
    • ConstraintTypeChecking.cc
    • CFunctions.cc
  • PlanDatabase
    • DbClientListerner.cc
  • Resource
    • FlowProfileGraph.hh
    • FlowProfileGraph.cc
    • BoostFlowProfileGraph.hh
    • BoostFlowProfileGraph.cc

如果是编译exe的话,在项目——> 项目属性——> 配置属性——> 链接器——> 系统——> 子系统中,应该设置为控制台 (/SUBSYSTEM:CONSOLE),如果是编译dll和lib,则保持原样即可。

x64环境适配

Constrains.cc文件中,获取vector.size()并转换为edoubleeint部分存在类型问题,要把size强制转换为unsigned int,以避免错误,修改如下:

// 1534行
(unsigned int)variables.size() - 1

// 1554行
(unsigned int)variables.size()

编译过程忽略以下两个警告:C4267C4302,这两个警告主要都是指针转换和数值截断警告。