GVKun编程网logo

移植到Cocos2d-x 3.8.1错误之一(Cannot open include file: 'extensions/ExtensionExport.h')

7

对于想了解移植到Cocos2d-x3.8.1错误之一(Cannotopenincludefile:'extensions/ExtensionExport.h')的读者,本文将是一篇不可错过的文章,并且

对于想了解移植到Cocos2d-x 3.8.1错误之一(Cannot open include file: 'extensions/ExtensionExport.h')的读者,本文将是一篇不可错过的文章,并且为您提供关于"extensions/ExtensionMacros.h”: No such file 问题、#include "extensions/cocos-ext.h" 无法打开、applicationContext.xml中的区别、Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”的有价值信息。

本文目录一览:

移植到Cocos2d-x 3.8.1错误之一(Cannot open include file: 'extensions/ExtensionExport.h')

移植到Cocos2d-x 3.8.1错误之一(Cannot open include file: 'extensions/ExtensionExport.h')

万万没有想到,把此前的2.X版本的游戏移植到当前的cocos2d-x 3.8.1版本下(自然是先测试一下WIN32版本喽),也遇到这么“浮浅”的BUG。

补充:我使用系统说明中的cocos命令行方式生成的工程框架,然后把各有关文件进行复制操作的。

环境:

  • Windows 7(64bits)

  • Visuall Studio 2013

  • Cocos3d-x 3.8.1 +Cocos Studio 2.3.2

如下图所示:

wKioL1Y5snLwm7LDAAIj-KNE-RE456.jpg

看起来是系统内置文件cocontrolutils.h中引用的头文件夹‘extensions/ExtensionExport.h’找不到,也就是说系统内部路径设置出现问题。

解决办法:

仔细对照系统内置DEMO工程cpp-tests,发现工程属性头文件路径引用处少了一个关键部分:

如下图所示:

wKioL1Y5s8rjc7bVAAK5BqZOmy0490.jpg

于是,在当前位置补充上$(EngineRoot),即消除上述编译错误。看起来,这个cocos2d-x 3.8.1又要快速升级了!

"extensions/ExtensionMacros.h”: No such file 问题

    今天在做2.x移植到3.1.1的时候候导入扩展包出现了错误,经过多方查找,最后终于把问题解决了,分享出来,给大家提供一个参考。

第一步,我们需要导入三个包,导入方式:解决方案(右键)-》添加-》现有项目

extensionmacros.h,cocos2d-x,error,包括,学习0

导入第一个libGUI.vcxproj  (H:\mycompany\EditBoxTest\cocos2d\cocos\ui\proj.win32)

extensionmacros.h,cocos2d-x,error,包括,学习1

导入第二个libExtensions.vcxproj  (H:\mycompany\EditBoxTest\cocos2d\extensions\proj.win32)extensionmacros.h,cocos2d-x,error,包括,学习2

导入第三个libCocosStudio.vcxproj   (H:\mycompany\EditBoxTest\cocos2d\cocos\editor-support\cocostudio\proj.win32)extensionmacros.h,cocos2d-x,error,包括,学习3

导完之后,进行第二步。


第二步,要把我们导入的项目引用到我们的项目里,这也是出现那个问题的原因,,

在工程名上右键-》引用-》添加新引用

extensionmacros.h,cocos2d-x,error,包括,学习4

然后把我们新添加的项目前边的复选框,选上就行了


extensionmacros.h,cocos2d-x,error,包括,学习5

第三步为我们的项目添加包含目录

项目名右键-》属性-》C/C++-》附加包含目录-》编辑


extensionmacros.h,cocos2d-x,error,包括,学习6

填入一下内容

$(EngineRoot)

$(EngineRoot)cocos

$(EngineRoot)cocos\editor-support


最后,编译一下,就没有那个错误了


备注:如果遇到“cocos-ext.h”: No such file or directory,再加上下面一句就好:

$(EngineRoot)extensions

#include

#include "extensions/cocos-ext.h" 无法打开

他妹的,这么简单的一个问题,要弄两个小时,气死我了!!!!!


这是官网的cpp-test文件里面的内容,我用3.10版本的cocostudio创建文件,里面没有,是下面这个样子:


所以总是提示#include "extensions/cocos-ext.h" cocos2dx 无法打开!!1

applicationContext.xml中<context:annotation-config> 和 <context:component-scan>的区别

applicationContext.xml中的区别

Difference between <context:annotation-config> vs <context:component-scan>

<context:annotation-config>是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanning的方式)上面的注解。

<context:component-scan>除了具有<context:annotation-config>的功能之外,<context:component-scan>还可以在指定的package下扫描以及注册javabean。

下面我们通过例子来详细查看他们的区别,

有三个class A,B,C,并且B,C的对象被注入到A中.

package com.xxx;
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc; 
  }
}

在applicationContext.xml中加入下面的配置 :

<bean id="bBean"class="com.xxx.B"/><bean id="cBean"class="com.xxx.C"/><bean id="aBean"class="com.yyy.A"><property name="bbb" ref="bBean"/><property name="ccc" ref="cBean"/></bean>

加载applicationContext.xml配置文件,将得到下面的结果:

creating bean B: com.xxx.B@c2ff5 creating bean C: com.xxx.C@1e8a1f6 creating bean A: com.yyy.A@1e152c5 setting A.bbb with com.xxx.B@c2ff5 setting A.ccc with com.xxx.C@1e8a1f6

OK,这个结果没什么好说的,就是完全通过xml的方式,不过太过时了,下面通过注解的方式来简化我们的xml配置文件

首先,我们使用autowire的方式将对象bbb和ccc注入到A中:

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}

然后,我们就可以从applicationContext.xml中移除下面的配置

<property name="bbb" ref="bBean"/><property name="ccc" ref="cBean"/>

移除之后,我们的applicationContext.xml配置文件就简化为下面的样子了

<bean id="bBean"class="com.xxx.B"/><bean id="cBean"class="com.xxx.C"/><bean id="aBean"class="com.yyy.A"/>

当我们加载applicationContext.xml配置文件之后,将得到下面的结果:

creating bean B: com.xxx.B@5e5a50 creating bean C: com.xxx.C@54a328 creating bean A: com.yyy.A@a3d4cf
ottom: 1em; border: 0px; vertical-align: baseline; clear: both; font-family: Arial,结果是错误的的,究竟是因为什么呢?为什么我们的属性没有被注入进去呢?

是因为注解本身并不能够做任何事情,它们只是最基本的组成部分,我们需要能够处理这些注解的处理工具来处理这些注解

这就是<context:annotation-config>所做的事情

我们将applicationContext.xml配置文件作如下修改:

<context:annotation-config /><bean id="bBean"class="com.xxx.B"/><bean id="cBean"class="com.xxx.C"/><bean id="aBean"class="com.yyy.A"/>

creating bean B: com.xxx.B@15663a2 creating bean C: com.xxx.C@cd5f8b creating bean A: com.yyy.A@157aa53 setting A.bbb with com.xxx.B@15663a2 setting A.ccc with com.xxx.C@cd5f8b
ottom: 1em; border: 0px; vertical-align: baseline; clear: both; font-family: Arial,结果正确了

但是如果我们将代码作如下修改:

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.xxx.B;
import com.xxx.C;
@Component
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}

applicationContext.xml配置文件修改为:

<context:annotation-config />

当我们加载applicationContext.xml配置文件之后,却没有任何输出,这是为什么呢?

那是因为<context:annotation-config />仅能够在已经在已经注册过的bean上面起作用。对于没有在spring容器中注册的bean,它并不能执行任何操作。

但是不用担心,<context:component-scan>除了具有<context:annotation-config />的功能之外,还具有自动将带有@component,@service,@Repository等注解的对象注册到spring容器中的功能。

<context:component-scan base-package="com.xxx"/>

当我们加载applicationContext.xml的时候,会得到下面的结果:

creating bean B: com.xxx.B@1be0f0a creating bean C: com.xxx.C@80d1ff

这是什么原因呢?

是因为我们仅仅扫描了com.xxx包及其子包的类,而class A是在com.yyy包下,所以就扫描不到了

下面我们在applicationContext.xml中把com.yyy也加入进来:

<context:component-scan basepackage="com.xxx,com.yyy"/><context:component-scan base-package="com.xxx"/> 
然后加载applicationContext.xml就会得到下面的结果:
creating bean B: com.xxx.B@cd5f8b creating bean C: com.xxx.C@15ac3c9 creating bean A: com.yyy.A@ec4a87 setting A.bbb with com.xxx.B@cd5f8b setting A.ccc with com.xxx.C@15ac3c9

哇,结果正确啦 !

回头看下我们的applicationContext.xml文件,已经简化为:

/><context:component-scan base-package="com.xxx"/>

了。

那如果我们在applicationContext.xml手动加上下面的配置,也就是说既在applicationContext.xml中手动的注册了A的实例对象,同时,通过component-scan去扫描并注册B,C的对象

<context:component-scan base-package="com.xxx"/><bean id="aBean"class="com.yyy.A"/>

结果仍是正确的:

creating bean B: com.xxx.B@157aa53 creating bean C: com.xxx.C@ec4a87 creating bean A: com.yyy.A@1d64c37 setting A.bbb with com.xxx.B@157aa53 setting A.ccc with com.xxx.C@ec4a87

虽然class A并不是通过扫描的方式注册到容器中的 ,但是<context:component-scan>所产生的的处理那些注解的处理器工具,会处理所有绑定到容器上面的bean,不管是通过xml手动注册的还是通过scanning扫描注册的。

那么,如果我们通过下面的方式呢?我们既配置了<context:annotation-config />,又配置了<context:component-scan base-package="com.xxx" />,它们都具有处理在容器中注册的bean里面的注解的功能。会不会出现重复注入的情况呢?

<context:annotation-config /><context:component-scan base-package="com.xxx"/><bean id="aBean"class="com.yyy.A"/>

不用担心,不会出现的:

因为<context:annotation-config />和<context:component-scan>同时存在的时候,前者会被忽略。也就是那些@autowire,@resource等注入注解只会被注入一次

哪怕是你手动的注册了多个处理器,spring仍然只会处理一次:

<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean"/>
<bean id="bla"/>
<bean id="bla1"/>
<bean id="bla2"/>
<bean id="bla3"/>

结果仍是正确的:

creating bean B: com.xxx.B@157aa53 creating bean C: com.xxx.C@ec4a87 creating bean A: com.yyy.A@25d2b2 setting A.bbb with com.xxx.B@157aa53 setting A.ccc with com.xxx.C@ec4a87

Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”

Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”

Cocos2d-x 3.0 Alpha 1开始 对目录结构进行了整合。结果有些附加项目也被在项目中被精简出去。

比如说如果你需要使用CocoStdio导出的JSON、或使用Extensions扩展库,libCocosstudio、libExtensions、libGUI都需要在你手动添加。


如果你碰到类似这样的错误“Fatal error C1083: 无法打开包括文件:“extensions/ExtensionMacros.h”: No such file or directory”。


可以采用下列的操作。

第一步:在项目中添加附加项目。

A:在“解决方案资源管理器”中找到整个解决方案,右击,选择“添加”->“现有项目”。在弹出的对话框中找到“你自己新建的项目目录/cocos2d/cocos/editor-support/cocostudio/proj.win32/libCocoStuido”点击确定。

B:在“解决方案资源管理器”中找到整个解决方案,右击,选择“添加”->“现有项目”。在弹出的对话框中找到“你自己新建的项目目录/cocos2d/cocos/gui/proj.win32/libGUI”点击确定。

C:在“解决方案资源管理器”中找到整个解决方案,右击,选择“添加”->“现有项目”。在弹出的对话框中找到“你自己新建的项目目录/cocos2d/extensions/proj.win32/libExtensions”点击确定。



在你导放完成之后,你的项目结构看起来像这样。


第二步:你需要在你的项目中引用这些刚导入的项目。

对你的项目右键,选择“引用...”。在弹出的属性页中点选下面的“添加新引用”。在弹出的子级对话框中勾选我们刚才刚加入的三个lib项目(如图),点击确定,这样就完成添加项目对库的引用。


第三步:为你的项目添加包含目录。

$(EngineRoot)

$(EngineRoot)cocos

$(EngineRoot)cocos\editor-support



如果需要cocostudio,还需要加入以下2行:
#include "cocostudio/CocoStudio.h"
using namespace cocostudio;


注意写法:

#include "extensions/cocos-ext.h"
#include "cocostudio/CocoStudio.h"

不是#include "cocos-ext.h",虽然这样子写win32可以编译通过,可是编译成android apk时会经常找不到cocos-ext.h等等错误


最后编译一下,完成此次附加项目的添加。

关于移植到Cocos2d-x 3.8.1错误之一(Cannot open include file: 'extensions/ExtensionExport.h')的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于"extensions/ExtensionMacros.h”: No such file 问题、#include "extensions/cocos-ext.h" 无法打开、applicationContext.xml中的区别、Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”的相关知识,请在本站寻找。

本文标签: