c++ - 奇怪的 Adob​​e Alchemy 编译器失败

标签 c++ opencv llvm alchemy

我正在尝试使用带有炼金术的 OpenCV 构建一个项目。我的想法是从 OpenCV (v.2.2) 中分离出我需要的部分,用炼金术 g++ 编译它们并静态链接我的代码。所以这就是我所做的:

首先,我一个一个地编译所需的 opencv 源代码(我需要 core、imgproc 和其他一些):

alc-on; for src in *.cpp ; do g++ -I../../include -DOSX -c -Wall -O3 -o ${PWD##*/}_`basename $src .cpp`.o $src ; done ; mv -v *.o ~/dev/cut/obj/

然后我尝试构建这个简单的 Flash-OpenCV 交互测试并将其链接到我如上所述构建的所有 .o:

#include <opencv/cv.h>
#include "AS3.h"

void testCV()
{
  cv::Mat a(3,3,CV_8UC1,cv::Scalar(1.0));
  cv::Mat b(3,3,CV_8UC1,cv::Scalar(2.0));
  cv::Mat c;
  c=a+b;
}

static AS3_Val test(void* self, AS3_Val args)
{
  testCV();
  return 0;
}

int main()
{
  AS3_Val testMethod = AS3_Function(NULL,test);
  AS3_Val result = AS3_Object("test: AS3ValType",testMethod);
  AS3_Release(testMethod);

  AS3_LibInit(result);

  return 0;
}

接下来,假设我在同一个文件夹中有源代码和所有需要的 .o,我尝试将它们编译为 swc:

g++ -I../include -Wall -O3 -DOSX -swc test_cv.cpp *.o -o cvtest.swc

(注意:使用“ar rc”和“ranlib”创建库存档并链接到它具有相同的效果)

此时,我从炼金术工具(我猜是 llvm)得到以下错误报告:

Assertion failed: (TLI.isTypeLegal(VT) && "Intrinsic uses a non-legal type?"), function visitTargetIntrinsic, file /Volumes/data/dev/FlaCC/llvm-2.1/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp, line 2465.
0   llc                                 0x00636dfe _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 6078
1   llc                                 0x006373a2 _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 7522
2   libSystem.B.dylib                   0x9125e05b _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   libSystem.B.dylib                   0x912eb5a5 raise + 26
5   libSystem.B.dylib                   0x913016e4 abort + 93
6   libSystem.B.dylib                   0x912ee20f __assert_rtn + 252
7   llc                                 0x003f3e2a _ZN4llvm11StoreSDNodeD1Ev + 90026
8   llc                                 0x003f5256 _ZN4llvm11StoreSDNodeD1Ev + 95190
9   llc                                 0x003f817c _ZN4llvm11StoreSDNodeD1Ev + 107260
10  llc                                 0x0040bc68 _ZN4llvm11StoreSDNodeD1Ev + 187880
11  llc                                 0x0040d3f2 _ZN4llvm11StoreSDNodeD1Ev + 193906
12  llc                                 0x0040f92e _ZN4llvm11StoreSDNodeD1Ev + 203438
13  llc                                 0x005d1926 _ZN4llvm12FunctionPassD1Ev + 20998
14  llc                                 0x005d1f3a _ZN4llvm12FunctionPassD1Ev + 22554
15  llc                                 0x005d20c5 _ZN4llvm12FunctionPassD1Ev + 22949
16  llc                                 0x00002e44 0x0 + 11844
17  llc                                 0x00001f36 0x0 + 7990
18  ???                                 0x00000006 0x0 + 6

我发现问题出在文件 matop.o(来自 OpenCV 核心模块的 matop.cpp),但我不能将其从链接中删除,因为它会导致 flash 运行时出现 undefined symbol 错误(它找不到 cv::添加,如果我没记错的话)。

谁能建议任何方法来识别真正的问题以及任何(甚至是肮脏的黑客风格)解决方法?

我在 adobe alchemy 论坛上关于问题和解决方法的帖子:http://forums.adobe.com/message/3891743#3891743

最佳答案

肮脏的 hack 解决方法:从 OpenCV2.0 核心 arithm.cpp 的顶部删除定义的部分

#if CV_SSE2
...
#else

只留下 else 部分。这适用于上面的示例。

OpenCV 的其他部分可能需要更令人难以置信的精巧破解。

关于c++ - 奇怪的 Adob​​e Alchemy 编译器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7257620/

相关文章:

c++ - 在控制台上显示 C++ 中 .txt 文件的动态变化

c++ - 如何通过opencv中的程序参数定义要素类型?

pointers - llvm中有符号执行工具吗?

iphone - 升级 XCode 4.0 后出现 LLVM GCC 4.2 错误

c++ - Microsoft header 对声明没有评论,那么文档在哪里?

c++ - C/C++,你如何在 CLI 中为下载进度编码? Linux

opencv - 尼康 D3400 的立体声校准

xcode - C++ 虚拟表崩溃 LLVM/XCode

java - 关于使用数组表示约瑟夫斯谜题

c++ - 使用 OpenCV 将帧转换为就像从上方获取的一样