2017-01-19 14 views
3

サーマルカメラから画像を読み込むアプリケーションを作成するためにPleora SDKを使用しようとしています。 私の最初の試みはネットワーク上で利用可能なデバイスを見つけることですが、C++の奇妙な動作に直面しています。これは本当に合理的な説明はありません。コードフローは "PvSystem lSystem "と呼ばれています。ここでは、私の説明を支援するために呼び出されない関数内のC++変数宣言が通常のアプリケーションフローを変更します

は、コードは次のとおりです。

#include <iostream> 

#include <PvSystem.h> 
#include <PvInterface.h> 
#include <PvDevice.h> 

int DeviceFinding() 
{ 
    PvSystem lSystem; 
    return 0; 
} 


int main() 
{ 
    std::cout << "Application start" << std::endl; 
    //DeviceFinding(); 

    return 0; 
} 

このコードは、次のビルドラインでのUbuntu 16.04 64-ビット上で実行すると:

g++ weird.cpp -g3 -o WeirdTest -I/opt/pleora/ebus_sdk/Ubuntu-14.04-x86_64/include -L/opt/pleora/ebus_sdk/Ubuntu-14.04-x86_64/lib -lPvBase -lPvBuffer -lPvStream -lPvDevice -lPvGenICam 

出力:

Error: GENICAM_ROOT_V2_4 is not set. 

しかし、私が ""とコメントした場合、PvSystemシステム」、

#include <iostream> 

#include <PvSystem.h> 
#include <PvInterface.h> 
#include <PvDevice.h> 

int DeviceFinding() 
{ 
// PvSystem lSystem; 
    return 0; 
} 


int main() 
{ 
    std::cout << "Application start" << std::endl; 
    //DeviceFinding(); 

    return 0; 
} 

期待されているものをアプリケーションが印刷:

Application start 

私は本当に何が起こっているかの見当がつかない。誰かがこれを理解するのを手助けできますか?

+2

ほとんどの場合、表示されなかったコードのどこかのバグから未定義の動作が発生します。 –

答えて

6

mainが起動する前に、グローバル変数の初期化が呼び出されます。

私はPleora SDKを知らないが、パターンの可能な説明はPvSystem参照を構築する必要がありますいくつかのグローバルオブジェクト(またはいくつかの関数を使用して初期化されたグローバル変数)main開始前には、エラーはそのコンストラクタ内で発生することがあります。

グローバルオブジェクトまたは変数が参照されていない場合(行にコメントするとき)、リンカーはそのグローバルオブジェクトをリンクから削除し、コンストラクターまたは初期化子は呼び出されませんでした。これは、リンカーが参照されていないグローバルをライブラリから削除できるためです。

一方、その行をアクティブにすると、リンカはPvSystemのどこかで参照され、mainの前にコンストラクタ(またはイニシャライザ)を呼び出すため、グローバルオブジェクトまたは変数をインスタンス化します。そのイニシャライザは、環境内で何らかのエラーを検出したため、アプリケーションを終了するか、例外をスローしました。

@SamVarshavchikのコメントのように、コードの中にmain(グローバルオブジェクト用)のコンストラクタがいくつか呼び出され、それらのコンストラクタのバグによって未定義の動作が引き起こされる可能性があります。

+1

いくつか試してみて、あなたの説明を聞いて、環境変数が設定されたアプリケーションを呼び出すだけで、私の問題が解決されたことに気づきました。 GENICAM_ROOT_V2_4 =/opt/pleora/ebus_sdk/Ubuntu-14.04-x86_64 // lib/genicam ./Weird.bin – Fernando

+0

ええ、 'getenv'で初期化されたライブラリ内のグローバル変数でなければなりません;) –

関連する問題