OpenCASCADEの最低限のサンプル

OpenCASCADE を用いた最低限のサンプルを書いてみます。下記は、2つのベクトルが平行か否かを検証するコードです。Standard_Macro.hxx は不要かも。

[c]

include <stdio.h>

include <Standard_Macro.hxx>

include <gp_Pnt.hxx>

include <gp_Vec.hxx>

int main()
{
gp_Pnt p1(0, 0, 0);
gp_Pnt p2(1, 0, 0);
gp_Vec v1(p1, p2);

gp_Pnt p3(1, 2, 0);
gp_Pnt p4(2, 3, 0);
gp_Vec v2(p3, p4);

if (v1.IsParallel(v2, 0) == Standard_True)
puts("parallel!");
else
puts("not parallel!");

return 0;
}
[/c]

ビルドします。

[bash]g++ -g -o hoge -I/usr/include/opencascade -lTKernel -lTKMath hoge.cpp[/bash]

実行します。

[bash]
$ ./hoge
not parallel
[/bash]

上手く動作している模様。次に、依存関係を調べてみます。

[bash]
$ ldd hoge
linux-gate.so.1 => (0xb77a0000)
libTKernel-6.3.0.so => /usr/lib/libTKernel-6.3.0.so (0xb7549000)
libTKMath-6.3.0.so => /usr/lib/libTKMath-6.3.0.so (0xb73f2000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb72fc000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb72d6000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb72b8000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7171000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb716d000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7153000)
/lib/ld-linux.so.2 (0xb77a1000)
[/bash]

使っていない直接参照を調べます。

[bash]
$ ldd -u hoge
Unused direct dependencies:

    /usr/lib/libTKMath-6.3.0.so
    /usr/lib/libstdc++.so.6
    /lib/i686/cmov/libm.so.6
    /lib/libgcc_s.so.1

[/bash]

あれ、TKMath は使われてないな。っと思ってビルド時に -lTKMath を外すと

[bash]
/tmp/ccSaJdhZ?.o: In function gp_Vec::Angle(gp_Vec const&amp;amp;) const':
/usr/include/opencascade/gp_Vec.lxx:111: undefined reference to
gp_VectorWithNullMagnitude?::Raise(char const*)’
/usr/include/opencascade/gp_Vec.lxx:114: undefined reference to `gp_Dir::Angle(gp_Dir const&amp;) const’
collect2: ld returned 1 exit status
[/bash]

gp_Vec クラスの依存関係の解決に失敗して ld から怒られます。

間接参照で、TKMath も使ってるってことかな。

んー、どいつとリンクさせればいいのか、いまいちちゃんと分かっていない感じです。

「OpenCASCADEの最低限のサンプル」への2件のフィードバック

  1. 質問をさせて下さい。

    dyamaさんのHPとOpencascade TechnologyのHPを参考にして、
    env.bat, custom.bat, msvc.batをコマンドプロンプトから実行し、
    リリース(デバッグ)モードでビルドをエラー無く行う事が出来ました。

    しかし、dyamaさんのHPの最低限のサンプルを参考にし、
    Visual studioで新しいソリューションを作成し、そのソースファイルに
    #include “gp_Pnt.hxx” int main(){}と書き、
    追加のインクルードディレクトリに$CASROOT/src/gpを追加し、
    追加のライブラリディレクトリに$CASROOT/win64/vc11/lib (libd)追加し、
    プロジェクトファイル内に$CASROOT/win64/vc11/bin (bind)の中身を入れ、
    ビルドを行いましたが、“include ファイルを開けません。’Standard.hxx’:“のエラーとなりました。
    次に、追加のインクルードディレクトリに$CASROOT/src/ Standardを追加しビルドを行いましたが、
    “error LNK2019: 未解決の外部シンボル “public: static void * __cdecl Standard::Allocate(unsigned int)” (?Allocate@Standard@@SAPAXI@Z) が関数 “public: static void * __cdecl Standard_Transient::operator new(unsigned int)” (??2Standard_Transient@@SAPAXI@Z) で参照されました。”のエラーとなりました。

    $CASROOT/src内の全てのcxxファイルを、ソリューションのソースファイルに追加し、ビルドした際には、このLNK2019エラーは無くす事が出来たのですが、$CASROOT /samples/mfcのソースコードには、$CASROOT/src内の全てのcxxファイルを追加したような形跡は見られず、このLNK2019エラー回避策は間違っているかと思います。

    どのようにすればdyamaさんのHPの最低限のサンプルをvisual studioでビルド出来るのかをお教え願えないでしょうか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください