1
votes

I'm trying to build a project using OpenCV with alchemy. My idea was to isolate the parts I need from OpenCV (v.2.2), compile them with alchemy g++ and link with my code statically. So here's what I do:

First I compile needed opencv sources one by one (I need core, imgproc and some others):

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/

Then I try to build this simple test of Flash—OpenCV interaction and link it against all .o's I have built as above:

#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;
}

Next, assuming I have the source and all needed .o's in the same folder, I try to compile them as swc:

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

(Note: creating a library archive with 'ar rc' and 'ranlib' and linking against it has the same effect)

And at this point, I get the following error report from alchemy tools (I guess it's 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

I found out that the problem comes from the file matop.o (matop.cpp from OpenCV core module), but I cannot throw it out of linking because it results in undefined sym error at runtime in flash (it cannot find cv::add, if I'm not mistaken).

Can anyone suggest any way to identify the real problem and any (even dirty hacking — style) workaround for it?

My thread on the problem and workarounds at adobe alchemy forums: http://forums.adobe.com/message/3891743#3891743

1
This looks to be an LLVM assertion failure. I couldn't help but notice you're still using LLVM 2.1, which is quite old. Maybe a newer version fixes the problem? Why an LLVM assert would complain in a call to g++ is a mystery to me though...rubenvb
Unfortunately, it's not me using llvm 2.1, but rather adobe alchemy dev team (they have tools bundled in the alchemy package)bonext

1 Answers

0
votes

Dirty hack workaround: remove defined section from top of OpenCV2.0 core arithm.cpp between

#if CV_SSE2
...
#else

and leave only the else-section. This would work for the example above.

Other parts of OpenCV might need more mindbogglingly exquisite hacking.