为什么我的程序在调用main之前就退出了
Why is my program exiting before main is called?
当我在嵌入式Linux上执行以下程序时,什么都不会发生:
#include <boost/thread/thread.hpp>
#include <boost/lockfree/spsc_queue.hpp>
#include <iostream>
#include <boost/atomic.hpp>
void Test(void)
{
std::cout << "Hello World" << std::endl;
}
int main(int argc, char* argv[])
{
std::cout << "init";
boost::thread producer_thread(Test);
producer_thread.join();
std::cout << "end";
}
# ./prog -> nothing happens here
strace输出的最后几行是:
open("/lib/libboost_thread.so.1.55.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "177ELF111 3 ( 1 240272 004 "..., 512) = 512
lseek(3, 95536, SEEK_SET) = 95536
read(3, " "..., 1200) = 1200
lseek(3, 95226, SEEK_SET) = 95226
read(3, "A' aeabi 135 055T 63101t1224241251"..., 40) = 40
exit_group(1) = ?
+++ exited with 1 +++
#
交叉编译的libbost_thread正好安装在/lib中。
调用main()之前的程序退出。该程序在我的Ubuntu下正常运行。
目标:带有buildroot(sama5d3)的ARM
工具链:arm-linux-gnueabihf-
问候
也许是一个提示:
您是否使用目标的编译和链接选项-pthread
链接libpthread?
如果没有,它可以产生与环境中相同的效果:程序启动,尝试启动一个新线程,不启用线程,并调用abort()函数。因为abort()只是在退出代码中给程序留下错误,所以不会发生其他事情。
你也可以添加你的编译&请链接用于调试目的的命令!
此外:
没有endl
的输出将不会打印,因为cout是缓冲的。只有当您调用flush
或发送endl
时,才会打印缓冲区。也许你在你的例子中改变了这一点。
希望能有所帮助。。。
strace
是一个跟踪系统调用的工具。在您的示例中,这包括对open()
、lseek()
和read()
的调用。具体来说,粘贴的片段显示操作系统的动态库加载器打开libboost_thread.so.1.55.0
文件并读取其内容;仅此而已。它并没有真正展示任何关于你的程序的东西,只是它与那个库相链接。
我发现了问题。
boost库是用arm-linux-gnueabi-(elibc)编译的,buildroot是用uClibc编译的。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 代码在main()中运行,但在函数中出现错误
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 如何让LLDB在成功时退出,在失败时等待
- C++控制台应用程序阻止退出
- 程序在执行程序的其余部分之前退出
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 构造函数在退出函数时无法初始化一个参数
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 即使将返回 0 作为 main 的第一行,程序也无法退出C++
- C++,Win32:如何在 main() 退出后调用函数
- main:返回0挂起,退出0关闭.如何调试
- 为什么我的程序在调用main之前就退出了
- 在函数 '_start' 中: (.text+0x20): 未定义对 'main' 的引用 collect2: ld 返回 1 个退出状态
- C++:如何在main()退出后打印一些文本
- 如何退出函数,但不退出main()
- 无法退出,因为析构函数错误导致main()在退出时停止执行
- c++子线程在main()父线程退出时终止