我正在尝试使用Pleora SDK创建一个从热像仪加载图像的应用程序.所以我的第一次尝试是在网络中找到可用的设备,但是我在C++中遇到了一个奇怪的行为我真的没有合理的解释:代码流跳转到其他一些而不是" PvSystem lSystem " 声明的主要功能即使没有被召唤.
为了帮助我解释,这里是代码:
#include#include #include #include 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 lSystem " 评论该行,
#include#include #include #include int DeviceFinding() { // PvSystem lSystem; return 0; } int main() { std::cout << "Application start" << std::endl; //DeviceFinding(); return 0; }
应用程序打印出预期的内容:
Application start
我真的不知道发生了什么.有人能帮我理解吗?
全局变量的初始化在main
启动之前被调用.
我不知道Pleora SDK,但是模式的一个可能的解释是PvSystem
在main
启动之前引用一些需要构造的全局对象(或通过某个函数初始化的全局变量),错误发生在该构造函数中.
当任何地方都没有引用该全局对象或变量时(当您对该行进行注释时PvSystem lSystem;
),链接器从链接中删除了该全局对象,并且未调用任何构造函数或初始化程序.这是因为允许链接器从库中删除未引用的全局变量.
另一方面,当您激活该行时,链接器实例化全局对象(或变量),因为它在某处被引用PvSystem
,并在main之前调用其构造函数(或初始化程序).该初始化程序在环境中检测到一些错误,因此退出应用程序或引发异常.
另一种可能性是,就像在@SamVarshavchik的评论中一样,你在代码中拥有一些在main之前调用的构造函数(对于全局对象),并且这些构造函数中的错误引发了一个未定义的行为.