为什么我的程序在调用main之前就退出了

Why is my program exiting before main is called?

本文关键字:退出 main 我的 程序 调用 为什么      更新时间:2023-10-16

当我在嵌入式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, "177ELF1113(1240272004"..., 512) = 512
lseek(3, 95536, SEEK_SET)               = 95536
read(3, ""..., 1200) = 1200
lseek(3, 95226, SEEK_SET)               = 95226
read(3, "A'aeabi135055T63101t1224241251"..., 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编译的。