1. 程式人生 > >基於x86體系結構openwrt上的libmysqlclient交叉編譯

基於x86體系結構openwrt上的libmysqlclient交叉編譯

1.建立交叉編譯環境

首先,在自己的機子上建立交叉編譯環境。 我使用的是Ubuntu14.04 x86_64,gcc-4.8.3。如果要建立一套十分完整的交叉編譯環境,需要安裝openwrt buildroot環境,操作步驟:
http://wiki.openwrt.org/doc/howto/buildroot.exigence,

注意在其中make menuconfig之後出現配置介面,主要選定目標系統的體系架構,比如我的是x86,其他如ar71xx等,另外選中編譯出toolchain,還有一項是打包openwrt SDK(這個很多文件有提到,我們不妨就勾選上吧)。 從make menuconfig介面來看,這個應該是在編譯整個openwrt,於是乎像編譯其他系統一樣,這個過程顯得漫長而無聊。我們不妨換個思路,我們一般交叉編譯時使用原始碼包中configure指令碼指定--host選項表示要編譯的目標平臺,如我的i486-openwrt-linux,而根據經驗來看,configure是根據這個值,在其後加上-gcc/-g++構成i486-openwrt-linux-gcc/g++形成目標平臺的編譯器進行呼叫編譯,之後根據所得到的編譯器名字在環境變數PATH指定的目錄下尋找到。 基於這個經驗性原理,我們為什麼要等待如此漫長的時間而位於編譯的路上呢。好的,我們去openwrt x86的源上直接下載官方已經編譯好的編譯器,然後設定PATH路徑不就好了嗎。嗯,在
http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/ 

就可以看到toolchain了,下載之,解壓,設定環境變數PATH即可,環境變數一般是$TOOLCHAIN_HOME/bin,這個$TOOLCHAIN_HOME表示你的工具鏈家目錄。 可以測試一下在命令列輸入i486-openwrt-linux- 然後按Tab鍵會不會補全出一大堆東西,如果可以,那就表示PATH設定好了。通過這樣的方法,我編譯通過了libnet, libpcap, libnids,這個根據我之前記錄的文件,編譯過程真是如絲般順滑...... 不過這樣的話,這個交叉編譯工具鏈會爆出warning,說沒有$STAGING_DIR這個環境變數,其實無視這個沒有什麼問題,前提是你不需要目標平臺的其他庫,如果實在不爽的話,可以設定一下,如果設定PATH的時候是$TOOLCHAIN_HOME/bin的話,這個$STAGING_DIR就是$TOOLCHAIN_HOME了。 如果安裝了buildroot的話,也是要設定這兩個環境變數的,跟上面一樣的。 後來在編譯另外一個東西的時候要連結pthread庫,這個時候就必須用這個完整的buildroot了,編譯器將STAGING_DIR指定的路徑作為標頭檔案和庫的預設目錄,應該是用到SDK中的pthread庫了。

2.交叉編譯libmysqlclient

這個過程可以參考
http://blog.csdn.net/lilongherolilong/article/details/7521736

這個文章,要嚴格遵守mysql-connector版本,並且參考下面5樓評論。 cmake生成Makefile之後,make進行編譯,出現錯誤
my_global.h:1582:22: error: static declaration of 'rint' follows non-static declaration

這尼瑪肯定是和參考文章的編譯器版本不一致導致的,可恨原文章關於環境毫無強調,我這的cmake版本是2.8.12.2的,交叉編譯器也是基於gcc-4.8.3的。  幸好,通過google發現有人說註釋掉它,ok,那我們註釋掉它吧。 接下來重新make,眼看著快好了,95%停下來了,觀其錯誤,一看undefined reference,當然就是連結出錯了,再看是關於floor,pow,log等函式的未定義引用,問題很明顯,沒有連結到math庫,肯定是連結選項少了-lm。 那麼到底是哪一條編譯命令呢,從目前的make顯示資訊上看只能看到進度,和目標檔案,錯誤資訊,我們需要的是類似於gcc -o test test.c這樣的東西,然後再後邊加上-lm。 好的,如果你熟悉make的話,那麼事情顯得輕而易舉,對,就是make VERBOSE=1,顯示詳情吧,很好,我們發現最後一條出錯的命令是這樣的:
/home/weizheng/openwrt/staging_dir/toolchain-i386_i486_gcc-4.8-linaro_uClibc-0.9.33.2/bin/i486-openwrt-linux-gcc    -Wall -fno-rtti -fno-exceptions -O3 -DNDEBUG -DDBUG_OFF    CMakeFiles/mysql_client_test.dir/mysql_client_test.c.o CMakeFiles/mysql_client_test.dir/__/mysys/my_memmem.c.o  -o mysql_client_test -rdynamic ../libmysql/libmysqlclient.a -lpthread

哦,原來是這條編譯命令後邊沒有加-lm。好的,我們分析這條命令,發現原始檔是
CMakeFiles/mysql_client_test.dir/mysql_client_test.c.o CMakeFiles/mysql_client_test.dir/__/mysys/my_memmem.c.o

但似乎並不在原始碼直接目錄下,因為在原始碼目錄下重新執行命令,會說上面這兩個檔案不在,那怎麼辦呢,這個檔案到底死到哪裡去了呢,好的,如果你熟悉find命令的話,那麼這個問題就迎刃而解了。
[email protected]:~/semanalysis/x86_openwrt_lib/mysql-connector-c-6.0.2$ find . -name mysql_client_test.c.o
./tests/CMakeFiles/mysql_client_test.dir/mysql_client_test.c.o

嗯,終於找到這貨了,在test目錄下,cd進去,執行編譯命令,ok,這個就算過了。 退回上層目錄,繼續make,發現還有別的一樣的錯誤,重複上述過程。當然似乎有一大堆編譯命令都沒有-lm,難道我們要一個個加上,這尼瑪也真有夠煩的。 嗯,再次拿出我們的殺手鐗,如果你...對make,Makefile夠熟悉的話,一般情況下是這樣的,make按照Makefile的組織語法解釋執行Makefile,好的,再一般情況下,會有一個選項叫LDFLAGS啦,嗯,就是這樣,我們直接修改這個LDFLAGS加上-lm不就完事了嗎,但是在Makefile中尋找LDFLAGS顯然不是一個明智的選擇,這麼多Makefile,你知道人家放到哪個裡面了,幸好,還有這個辦法,就是環境變數。
export LDFLAGS+=-lm

之後重新cmake,make就ok了,終於尼瑪華麗的成功了,呵呵呵呵... 對了,別忘了make install哦! ================= main ================= 魏徵WeiZ

相關推薦

基於x86體系結構openwrtlibmysqlclient交叉編譯

1.建立交叉編譯環境 首先,在自己的機子上建立交叉編譯環境。 我使用的是Ubuntu14.04 x86_64,gcc-4.8.3。如果要建立一套十分完整的交叉編譯環境,需要安裝openwrt buildroot環境,操作步驟: http://wiki.openwrt.or

基於x86體系結構分析linux的啟動過程

僅考慮32位體系結構 不考慮多核多處理器 要求1:分析流程按照開機-->BIOS-->grub-->Linux的順序進行,到start_kernel結束 第一步——>載入BIOS: 開啟計算機電源後,計算機會首先載入BIOS資訊,這是因為BIO

3.2 x86體系結構

描述符 而在 系列 就是 它的 重新編譯 重要 ios 也會 計算機組成 3 指令系統體系結構 3.2 x86體系結構 X86是商業上最為成功,影響力最大的一種體系結構。但從技術的角度看,它又存在著很多的問題,那我們就來一起分析X86這種體系結構的特點。 要探討x86體

在Linux pc交叉編譯環境的搭建

交叉編譯環境 在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的程式碼,在Linux PC上,利用arm-linux-gcc編譯器,可編譯出針對Linux ARM平臺的可

在hisiQT交叉編譯過程(帶webengine)

伺服器:ubuntu 16.04 LTS server_64bit 1、安裝交叉編譯器 海思:aarch64-himix100-linux PATH匯出交叉編譯器 2、下載和解壓QT原始碼5.9.6 http://download.qt.io/archive/qt/ 3、

三.在linux安裝交叉編譯環境

我使用的是友善之臂的開發板,配套光碟資料,在光碟資料的 友善之臂tiny4412-A資料夾下的linux資料夾中有交叉編譯工具:arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz。將這個工具包通過samba伺服器拷貝到linux系統下。然後解壓。

libvlc3.0.4在ubuntu16.04x64交叉編譯全過程記錄

 週末折騰了好久,經過連續的出現問題,定位問題,解決問題,終於順利編譯通過了vlc的最新版本,中間嘗試了多個版本的編譯,比如vlc3.0.0,想著離2.x版本(2.x版本已經編譯通過,可以參考:ubuntu平臺,VLC/LibVLC交叉編譯,生成win32版本,以及LibVLC增加錄影介面

iperf for Linux 在TOP6410交叉編譯和使用

作者:中芯優電 高階工程師 北航碩士 :黃真 使用的核心:2.6.28 使用的交叉編譯器:arm-linux-gcc-4.3.2 使用的iperf的原始碼:Iperf2.0.2 使用的主機:Ubuntu10.04 首先介紹一下什麼是Iperf?(借用網上的解釋)    

Python tkinter 實現簡單登陸註冊 基於B/S三層體系結構,實現用戶身份驗證

cte cursor 實現簡單 結果 pass 分享圖片 not null for 技術 Python tkinter 實現簡單登陸註冊 最終效果 開始界面 ? 註冊 登陸 ? 源碼 login.py # encoding=utf-8 f

理解Oracle體系結構 並在CentOS 7 安裝Oracle 12c

eve oinstall tst dbms ssis 內存 字符 數據庫管理系統 proc 簡介: Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關系數據庫管理系統。它是在數據庫領域一直處於領先地位的產品。可以說Orac

計算機網路體系結構綜述()【轉】

(轉自:https://blog.csdn.net/justloveyou_/article/details/69611328) 摘要:   計算機網路體系結構標準的制定使得兩臺計算機能夠像兩個知心朋友那樣能夠互相準確理解對方的意思並做出優雅的迴應。本文首先概述了計算機網路體系結構的提出動機

HBase(六): HBase體系結構剖析()

  Posted on 2016-09-10 19:37 天戈朱 閱讀(3591) 評論(2) 編輯 收藏       HBase隸屬於hadoop生態系統,它參考了谷歌的Big

最全的基於ffmpeg+sdl網路攝像頭編解碼播放資料(包含交叉編譯過程,附帶完整原始碼)

原創博文,嚴禁私自轉載,轉載請註明出處!!! 近期,由於工作需要,要在開發板上跑一個攝像頭,攝像頭款式比較老,不支援rtsp格式,所以選擇編譯ffmpeg+sdl實現軟解碼播放攝像頭,特此記錄整個編譯過程(非常之艱辛,發文留念) 在ubuntu上交叉編譯環境的搭建:因為開發板上搭建的程式的執

逃離x86架構-----CPU體系結構CISC與RISC之爭

                轉載:http://hi.baidu.com/zaoyuan1217/blog/item/59015b11e8385d165baf534e.htmlx86架構誕生 Intel 8086是一個由Intel於1978年所設計的16位微處理器晶片,是x86架構的鼻祖。不久,Intel

交叉編譯monit在openwrt 18.06.1 MTK7620監控kcptun

由於go寫的kcptun比較爛,執行一段時間總是莫名其妙的崩潰,所以一直想找一款可以監控其執行的工具,如果是在ubuntu上可以直接使用supervisor來監控,但是這工具是python寫的,在openwrt路由器平臺上,flash限制根本跑不了python環境,嘗試過兩次失敗

X86/X64處理器體系結構及定址模式

由8086/8088、x86、Pentium發展到core系列短短40多年間,處理器的時鐘頻率幾乎已接近極限,儘管如此,自從86年Intel推出386至今除了增加一些有關流媒體的指令如mmx/sse之外,其他新增的大多數指令都可以從最初的指令集中組合實現同

基於mini2440嵌入式linux整合一套Domoticz智慧家居系統(七)交叉編譯paho.mqtt.embedded-c庫和嵌入式linux樣例程式

本篇將把paho.mqtt.embedded-c官方的原始碼交叉編譯成資料包封裝庫和應用程式兩部分,並把樣例應用程式在mini2440上執行。 一、首先編譯MQTT協議包封裝庫: 解壓paho.mqtt.embedded-c-master.zip之後,進入目

基於mini2440嵌入式linux整合一套Domoticz智慧家居系統(四)交叉編譯OpenSSL、c-ares、e2fsprogs和mosquitto

本篇主旨是編譯安裝mosquitto,其他的庫是它的依賴庫。後面我們交叉編譯的程式都將放置在主機的”/usr/local/arm/”目錄中,以區別主機本地的應用程式。 我的mimi2440的根檔案系統是PC端VMWare上linux中的nfs,這樣比較容易除錯

android的四層體系結構基於mvc三層結構淺析

從多方面理解Android體系結構 1.以分層的方式來看Android 安卓體系結構分為四層。 首先看一下官方關於Android體系結構的圖: 1)、Linux Kernel:負責硬體的驅動程式、網路、電源、系統安全以及記憶體管理等功能。 2)、 Libraries和

基於TCP/IP協議的多執行緒雙向通訊在OpenWrt的實現

1、TCP/IP協議組 TCP/IP協議(傳輸控制協議)由網路層的IP協議和傳輸層的TCP協議組成。 IP層負責網路主機的定位,資料傳輸的路由,由IP地址可以唯一的確定Internet上的一臺主機。 TCP層負責面向應用的可靠的或非可靠的資料