那些年独自踩过的flascc的坑

[一个工程中使用多个flascc编译出来的swc]

1、如果是swf工程, 工程中同时使用多个flascc编译出来的swc, 可以顺利通过。

2、如果是swc工程, 工程中同时使用多个flascc编译出来的swc,编译报错:

  Error: the script name ABC0 was used multiple times.

究其原因, 打开一个swc内部的catalog.xml可以看到类似于如下的标签

  <script name="ABC0" mod="1436409992126">

问题和这个有关, 因为flascc编译出来的swc, script name都是"ABC0".  至于为什么swf能通过, 而swc不行, 暂时还不知道原因。

解决办法:

假设是swc_host需要引用flascc编译出来的swc1和swc2,则需要把swc1和swc2的引用方式改为external library, 这样swc_host可以正常编译, 但是不包含所引用的外部库的内容。

如果某个swf工程需要引用swc_host, 则需要额外引用swc1和swc2。

[关于swig编译器]

swig编译器可以方便的把c的接口和类导出为as格式, 但是官方文档明确说明:

防止按值返回结构和对象的函数的包装器发生内存泄露

当使用 SWIG 编译器从 C/C++ 头文件创建 SWC 时,请注意以下几点:

  • 默认情况下,按值返回结构和对象的函数的包装器会泄露内存。 SWIG 无法自行了解何时应当释放这些值,因此,我们期望调用包装器的代码能够保证在适当的时间释放返回的值。
  • Flascc 不包含任何 std::string 标准 Typemap,也不包含任何 C++ 标准库类。 正因如此,在包装器中std::string 或相似类的许多应用可能无法按预期正常运行,您将需要编写应用程序特定 Typemap 达成所需的行为。

特别是标准库的问题, 如果一个类含有标准库相关的变量或接口, 这时候又用swig来导出该类, 这时候行为不确定。 巨大的一个坑, 很不容易发现。

[关于c++代码输出调试信息]

要想c++代码利用标准io输出调试信息到as的控制台, 需要在as里即使指定了CModule.vfs.console(ISpecialFile).

这里有个坑是, 如果一个flascc编译的swc, 这个swc对应的main函数需要按如下格式定义

int main()
{

}

其中main的定义不能带参数, 否则write接口也不会触发。

原文地址:https://www.cnblogs.com/zilongblog/p/4633272.html