1. 說明
硬件環境:
迅爲imx6q開發板, ARM Cortex-A9的處理器
7.0寸電容觸摸屏
軟件環境:
使用的是迅爲官方提供的u-boot.imx , uImage, Qt5.7的rootfs根文件系統
問題:
在使用迅爲提供的Qt5.7的系統時,發現板子的動態庫不支持c++ 的東西,只支持Qt,於是就開始了找原因的過程。
下面是在迅爲提供的Qt5.7的系統上執行c++的報錯問題:
找不到動態庫 GLIBCXX_3.4.11
通過執行 strings /lib/libstdc++.so.6 |grep GLIBCXX 後:
發現確實找不到 GLIBCXX_3.4.11。 於是從網上下載了比較新的 libstdc++.so.6.0.17 庫,下載鏈接如下:
https://download.csdn.net/download/nangui/5192279
然後執行如下步驟:
- 將 libstdc++.so.6.0.17拷貝到開發板 /lib/ 目錄下
- 刪除原來的libstdc++.so.6, 執行 rm -rf libstdc++.so.6
- 建立新的指向libstdc++.so.6.0.17的軟鏈接, 即:
ln -s libstdc++.so.6.0.17 libstdc++.so.6
至此,板子的環境問題就全部解決
2. 板子測試一個c++11的多線程的Demo
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
//#include <iostream>
#include <thread>
void led_proc1();
void led_proc2();
#define MAX 100
int main(void)
{
std::thread t1(led_proc1);
std::thread t2(led_proc2);
t1.join();
t2.join();
//std::cout << "thread john finish" << std::endl;
printf("thread john finish");
return 0;
}
void led_proc1()
{
int fd,LedOnOffTimes;
char gpio[MAX],cmd[MAX];
char *leds = "/dev/leds_ctl";
LedOnOffTimes = MAX;
printf("leds light on and off 5 times \r\n");
if((fd = open(leds, O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open %s failed\n",leds);
else
{
printf("open %s success\r\n",leds);
while(LedOnOffTimes--)
{
printf("ioctl leds %d times\n",LedOnOffTimes);
ioctl(fd,0,0); //parameter 2 is cmd ,cmd = 1 leds on
//ioctl(fd,0,1);
sleep(1);
ioctl(fd,1,0);
//ioctl(fd,1,1);
sleep(1);
}
}
close(fd);
}
void led_proc2()
{
int temp = 100;
while(1)
{
//std::cout << "temp= " << temp-- << std::endl;
printf("temp= %d\r\n",temp--);
sleep(2);
}
}
交叉編譯命令如下:(注意,編譯c++的編譯器版本務必在4.8以上才支持)
arm-none-linux-gnueabi-g++ -lpthread led_cpp_thread.cpp -o ledThread3 -std=c++11
其中,因爲用到了多線程,因此要加上 -lpthread 命令
用到c++11, 要用到 -std=c++11 命令