stlport編譯
㈠ 如何在Windows下編譯STLport 6.0.0
我聽都沒聽說過可以這樣做,首先,Windows不支持linux的文件系統,如EXT3,EXT4,XFS之類的,其次,雖然有MinGW這樣的編譯工具,但無法用這些工具構建一個可以讀取和寫入上述文件系統的chroot工具包環境,因為在編譯Linux過程中,需要多次使用chroot。
㈡ 如何在windows上用ndk交叉編譯其他平台程序
目標 :編譯arm64的.so庫
編譯方法:理論上應該有兩種交叉編譯方法,法一,在Linux伺服器上安裝交叉工具鏈,直接用交叉工具鏈進行編譯鏈接;法二,使用ndk完成交叉編譯,因為
ndk已經安裝好交叉編譯工具鏈,以及相關的系統庫和系統頭文件了。這兩種方法的區別在於,linux伺服器上的編譯使用的makefile和ndk使用的.mk
文件顯然不同。原因是ndk作為一個集成編譯環境,制定了一套特定的規則用於生成最終的編譯腳本。
這里簡單總結下,如何在windows用ndk進行交叉編譯arm64目標平台的.so庫:
step1:找到ndk開發工具包,官網之類的都可以下載,Android-ndk64-r10-windows-x86_64.rar文件
step2:解壓上述ndk工具包,將包含程序源文件和頭文件的文件夾testProject都放入android-ndk-r10下的samples目錄下。
放在其他地方當然也可以,但是後續相對路徑之類的不太好加,既然其他例子都放這,把代碼放這編譯是最保險的了。
step3:在testProject中增加一個jni的文件夾,必須要添加!!!!!!
step4:在jni文件夾中,添加一個Android.mk的文件,必須要添加!!!!!
step5:在jni文件夾中,添加一個Application.mk的文件與Android.mk並列,必須要添加!!!!!
step6:Android.mk和Application.mk合起來就類似於linux環境下的makefile編譯文件。
如何寫Android.mk,可以參考例子helllo-jni中jni文件夾下的Android.mk。
LOCAL_PATH:=$(call my-dir) #必須要寫的
include $(CLEAR_VARS) #必須要寫的
LOCAL_MODULE:=hello-jni #編譯出來的模塊名稱
LOCAL_SRC_FILES:=hello-jni.c #制定編譯的源文件名稱
include $(BUILD_SHARED_LIBRARY)#放在最後
除了上述變數之外,還有其他的指定的變數,
LOCAL_CFLAGS,用於指定編譯選項,這個和makefile中是完全一樣的,可以指定編譯選項-g,也可以指定編譯宏及宏值
LOCAL_LDLIBS,用於指定鏈接的依賴庫,這個可以makefile也是完全一樣的,可以指定鏈接庫用-l庫名,以及指定庫搜索路徑用_L路徑名
LOCAL_STATIC_LIBRARIES,指定鏈接的靜態庫名,makefile中沒有
LOCAL_C_INCLUDES,用於指定編譯頭文件的路徑,和makefile中不同,路徑前不需要加-I,直接寫路徑即可,可以是相對路徑或絕對路徑,
多個路徑之間用空格隔開。
編寫上述Android.mk碰到的問題有,
(1)使用默認的系統自動載入stl庫頭文件總是出錯,只好手動在LOCAL_STATIC_LIBRARIES指定sources/cxx-stl/stlport/stlport來完成對#include<string>這種c++形式的頭文件載入
(2)使用$(SYSROOT)/usr/include來完成對系統庫頭文件的載入,結果找不到sem_t符號,只好指定platforms/android-L/arch-arm64/usr/include
step7:Application.mk編寫
APP_STL指定使用的stl移植庫,動態或者靜態都行
APP_CPPFLAGS,指定app編譯的編譯選項
APP_ABI指定abi規范類型,例如arm64-v8a,也可以寫成ALL就是把所有的類型全部編一編
APP_PLATFORM指定編譯的platform名稱,這里可以寫成android-L或者不指定全編。
step8:編譯完成後,運行。
啟動cmd,使用cd /D進行到testProject的jni目錄下
step9:將android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此時直接敲回車,就可以編譯了。當然也可以加一個 clean,清除編譯中間文件。
step10:檢查下編譯結果,編譯成功後在testProject中多了兩個文件夾與jni並列的,libs和obj。
編譯鏈接後的結果就在libs中!
㈢ sgi版的stl與STLport有哪些區別
STL是標准模板庫的簡稱,從94年7月開始納入C++標准後得到迅速發展,形成了不同的版
本。目前使用最廣的是SGI STL和STLport。
STL本質上是為了配合SGI自作的UNIX變體IRIX所量身定做,好在STL都是一些標准介面和實現的頭文件,隨著大師們的不斷改進,移植起來不太復雜。
㈣ 在vc6下使用stlport 編譯時出現如下錯誤是什麼原因造成的
沒有安裝gcc,要先安裝gcc才能編譯軟體
你的採納是我前進的動力,還有不懂的地方,請繼續「追問」。
如你還有別的問題,可另外向我求助;答題不易,互相理解,互相幫助。
㈤ 在vc6下使用StlPort 編譯時出現如下錯誤是什麼原因造成的
Dev C++ 用的是著名 的 GNU 編譯器集合中的編譯器
windows 下的首選的編譯器是被打包進 VC 的 Microsoft 的 CL, 在 Windows 下的各種編譯器里
Microsoft 的 CL 具有極佳的性能, 常常能生成極快速極短小的代碼(這個和 Microsoft 打包進 VC 的標准 庫 也有關系).
如果是 Intel 處理器, 可以考慮的是 Intel 的 C++ 編譯器,不過使用起來比較麻煩.
GNU 編譯器集合的優點在於其良好的跨平台性能, 你 可以在各種平台上使用 GNU 的編譯器
其是 Unix/Linux 平台的首選編譯器(實際上,大多數 Unix/Linux 都搭載了 GCC).
至於對標準的支持度, GCC 應該是比較好的(對 C 語言), 對標准 C++ 來說, Microsoft 的 VC2005 以上也做得很不錯.
用 VC6 來比較 Dev C++ 5 是不恰當的, VC6 是應該淘汰的東西了
要用來學習 C++ 的話,最低也該用 VC2005
理由: VC6 比 標准 C++ 還古老, VC6 的時代還沒有標准 C++ 這個東西
要用來做實際工作的話,最低也該用 VC2005
理由: VC6 不支持新的平台,特別是 amd64 和 it64.VC 6 不支持 VISTA.
不過,Dev C++ 5 Beta 也是有點老了,要做實際工作的話,Windows 下 使用 Dev C++ 5 Beta 時要注意兼容性,實在不行的話就更新 MingW 和 GCC.
VC++ 6.0是97年正式竣工的,98年開始有C++標准,後來C語言又修訂了標准C99,再後來又有C++2003標准,明年C++標准會有C++0X,這樣看來VC++6.0對C++支持不好是很正常的事情,對標準的C99支持不好也是很正常的事情。
GNU Dev C++ 4.9.9.2,2005年最後一版,據說對C++標准支持比較好,再後來有wx-devcpp繼續了它的道路,至今一直繼續升級。
我個人的使用經驗是這樣,如果你把VC++6.0當成一個C語言的IDE可能還不錯,但是編譯C++程序,恐怕就有點牽強了,我平時寫得C++代碼[如果沒有語法錯誤的話],VC++6.0即使打上SP6補丁相信90%以上的可能性編譯不過去。Dev C++ 4.9.9.2可以編譯過去的可能性相信會超過98%。如果寫C程序,假如沒有語法錯誤的話,VC++6.0和GNU Dev C++ 4.9.9.2基本上都可以編譯成功。
由於都是IDE,VC++6.0調試程序更方便一些,用VC++6.0可以開發C應用程序,Win32應用程序,還可以方便的使用MFC開發很多應用程序,不過問題是,MS的IDE新版本有很多時候並不兼容VC++6.0,有些函數的參數重新修訂,有些函數和類已經廢棄,有些已經改名,當然還擴充了不少。
VC++6.0對STL支持不佳是很正常的事情,比如getline庫函數本身有bug,list成員函數sort本身有bug,還有很多其他問題,VC++6.0對模板支持很差,對友元支持很差,還有很多方面支持很差。對模板支持差,這種情況一直到VS2003(C++7.0)都沒有很好的解決,VS2003不支持模板的偏特化。
GNU Dev C++ 4.9.9.2比較小,安裝後大約50M大小(VC++6.0安裝後至少幾百M),可以開發C,C++,Win32應用程序等等,使用Dev C++ 4.9.9.2編譯C++程序,用的是g++3.4.2編譯器。Dev C++對標准C++支持較好,據我所知,僅僅友元模板函數在類裡面實現可以正常編譯,但是放到類外就不行,到目前為止僅僅發祥這一個問題,還有一個問題就是代碼最大優化,你需要便宜環境設置裡面加上命令-O3。
另外,我還使用過Intel C++ 9.0,以插件的形式安裝在VC++6.0這個IDE上,對C++的支持力度僅次於Dev C++ 4.9.9.2,但是編譯代碼以後執行速度稍快一點。
如果你喜歡使用MS的編譯器,建議使用VC++8.0[VS2005],缺點是占據硬碟空間很大,加上MSDN,至少2GB以上。
如果你是C++初學者,使用環境Windows平台,GNU Dev C++ 4.9.9.2(g++3.4.2)可能是你非常好的選擇。如果你使用linux平台,可以升級g++編譯器版本到4.2.1甚至更高。
㈥ win7下vs2010編譯boost怎麼配置stlport
一、安裝cmake
1、這一步比較簡單,下載安裝最新版本cmake-2.8,開始如下安裝
2、注意這里選擇第二個選項,為所有的用戶添加系統變數
3、選擇安裝到目錄 F:\CMake 2.8,個人建議最好安裝在C盤目錄下。
4、安裝完畢後確認一下系統變數中有沒有紅色框中的目錄,若沒有需要手動添加進去。
5、cmake安裝完畢!
二、安裝Boost庫
1、下載最新版本,當前為boost_1_55_0
2、按 Win+R組合鍵輸入cmd進入命令窗口:
切換當前目錄為boost的安裝目錄(G:\boost_1_55_0),輸入bootstrap.bat
3、執行完上述命令後會在安裝目錄下生成如下exe文件
4、繼續在DOS窗口中輸入bjam.exe,程序會根據你當前安裝的編譯環境(vs2010,vs2012,vs2013)等自動選擇與之相適應的庫文件和包含文件等。
此過程大概需要20分鍾左右。根據下面第二個圖片可以算出我的編譯環境為MSVC-12.0即VS2013.
5、20分鍾左右後可以看到如下界面,說明Boost庫配置完成
三、安裝CGAL
1、下載CGAL,這里我下載的是CGAL-4.4這個版本(當前最新的)
2、安裝位數選擇32位
如果選擇64位進行安裝,則會在以後配置完畢後出現類似「無法識別的外部符號。。。」等問題,很難進行正確配置。所以這里最好全部選擇32位進行安裝。
3、安裝目錄我選擇C:\Program Files\CGAL-4.4
安裝在其他目錄時可能會出現用Cmake編譯時出現好幾外錯誤。可以嘗試通過安裝在C盤進行解決。
4、選擇如下幾項,單擊下一步
5、安裝完成後可能會出現如下提示,則需要手動添加F:\CGAL-4.4\auxiliary\gmp\lib到Path變數中
6、此時CGAL安裝完成
四、用Cmake配置CGAL庫
1、打開Cmake軟體選擇如下目錄,註:兩個目錄是相同的
2、單擊「config"-選擇如下編譯器(默認是32位,與前面安裝軟體一定要保持一致)
3、單擊確定後,出現如下界面說明配置成功
4、找到如下圖的這一項,選中,再次單擊"config"進行配置
5、單擊Generate,此時界面應如下。
6、此時在CGAL安裝目錄下出現如下文件:CGAL.sln
7、打開此文件,此時編譯器會自動組建一個解決方案。如下圖
8、選擇32位debug模式,按F7進行編譯,編譯完成後如下圖所示,表明CGAL至此完全配置成功。
五、舉例測試CGAL
新建一個控制台應用程序,並添加如下代碼
#include <iostream>
#include <boost/format.hpp>
#include <QtGui>
#include <CGAL/Qt/GraphicsViewNavigation.h>
#include <QLineF>
#include <QRectF>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setSceneRect(0,0, 100, 100);
scene.addRect(QRectF(0,0, 100, 100), QPen(QColor(255,0,0)));
scene.addLine(QLineF(0,0, 100, 100));
scene.addLine(QLineF(0,100, 100, 0));
QGraphicsView* view = new QGraphicsView(&scene);
CGAL::Qt::GraphicsViewNavigation navigation;
view->installEventFilter(&navigation);
view->viewport()->installEventFilter(&navigation);
view->setRenderHint(QPainter::Antialiasing);
view->show();
return app.exec();
}
添加包含庫目錄,操作如下圖,注意紅色框中的添加內容
添加附加庫目錄,操作如下圖,注意紅色框中的添加內容
㈦ 關於粒子群優化演算法的編譯錯誤,求指導!!! 雖然分少了點,但是真心謝謝你的幫助!!
注意: vc在處理.c 文件是按C 語言編譯的,所以
假如有以下文件: 1.c
#include <fstream>
int main(int argc, char* argv[])
{
return 0;
}
那麼編譯時就會出錯:
fatal error C1189: #error : "eh.h is only for C++!"
這是因為fstream標准庫要求用到eh.h文件,而Exception Handling的實現需要c++支持。
修改方法有兩種:
1. 只要把1.c改成1.cpp即可,
2. 或者使用老式庫fstream.h代替,修改如下:
#include "fstream.h"
int main(int argc, char* argv[])
{
return 0;
}
也可以。
但是第2種方法在你用到stlport的stl代替vc的stl的情況下編譯時,
會出現同樣的錯誤:
fatal error C1189: #error : "eh.h is only for C++!"
這是因為stlport實現的fstream.h同樣需要c++支持。
㈧ Android NDK中對STL的兩種支持gnustl和stlport有什麼區別
Android NDK從r5b版本開始有官方支持的STL了,有一個crystax版本早已經支持。官方的支持有兩個版本一個是gnu的,一個是stlport。如果你需要在你的NDK程序中使用STL,那麼需要在Application.mk文件中添加一個選項,就是APP_STL := stlport_static。 其中APP_STL的取值有以下四種: system -- 系統默認的最小支持的C++運行時庫 stlport_static -- 以靜態鏈接的方式使用stlport版本的STL stlport_shared -- 以動態鏈接的方式使用stlport版本的STL gnustl_static -- 以靜態鏈接的方式使用gnu版本的STL如果你和我一樣並沒有使用Android.mk和Application.mk,而是使用Code::Blocks或者Visual studio 2010,那麼在配置環境時,如果需要STL的支持,那麼就需要注意自己要指定stl的包含路徑。鏈接就根據需要自己鏈接不同的版本。請注意,stlport有靜態鏈接和動態鏈接兩種方式,而gnu的僅有靜態鏈接方法。另外一個需要注意的就是官方提供的這個stlport版本不支持RTTI和異常,換言之,如果你使用了stlport版本的STL,則不能使用-fexceptions和-frtti這兩個編譯選項。
㈨ 1.2.1 什麼是STLport
本節將介紹C++標准庫的一個高效實現STLport,可以用於配合Boost程序庫工作。
STLport是一個完全符合C++98標准(及2003年修訂)的免費的C++標准庫實現。它是由俄羅斯人Boris Fomitchev於1997年發起的開源項目,目的是基於著名的SGISTL開發一個可移植到各種平台上使用的高效的C++標准庫。
STLport具有很多其他STL實現所沒有的優點。首先是高度的可移植性,可以配合市面上幾乎所有的操作系統和編譯器使用,使開發的程序能夠在不同的編譯平台上獲得一致的標准庫實現。其次是性能表現優秀,其原始版本SGISTL就以高效而聞名,STLport在移植時也特別注重性能與效率,而且100%完全符合C++98標准規范。第三個優點是在標准之外增加了若干有用的擴展,如rope(增強的字元串類)、slist(單鏈表數據結構)、hash_map(散列映射容器),以及支持線程安全。
STLport以其優異的品質自發布以來獲得了極大的成功,以至於Boost專門為STLport提供了編譯選項和設置。
Windows平台開發主流工具是MSVC,其自帶的STL向來名聲不佳,雖然隨著VC的版本升級而逐漸改善,但質量仍非一流水準。作者曾經在工作用機上運行過簡單的自測,結果是VC8自帶的STL(Dinkumware v405)較STLport5.21慢大約一倍;而VC9自帶的STL(Dinkumware v503)速度雖然有較大改善,基本與STLport5.21速度相當,但仍有大約10%以上的差距。綜合各個方面來看,STLport都較VC自帶的Dinkumware STL實現好很多。
㈩ 如何在Android平台下編譯帶STL的C++程序
1、下載最新的Android SDK,下載Android NDK R9C版本。
2、如是在windows平台下需要在PATH中設置環境變數,以便於直接調用NDK來編譯C++程序。
將如下兩個路徑加入到PATH中:<ANDROID_NDK>;<ANDROID_SDK>\platform-tools
其中<NDK>為你的計算機上Android NDK的安裝路徑,<SDK>為Android SDK的安裝路徑
如果在你的SDK下沒有platform-tools目錄,則在Eclipse中按照如下截圖進行操作:
3、為要編譯的C++程序建一個文件夾,如myproject。在myproject下再建一個jni文件夾,將源代碼放在這個文件夾下,myproject/jni。
mkdir myproject
mkdir myproject/jni
4、在jni文件夾下建兩個分別名為:android.mk和
application.mk文件。android.mk類以於C++程序的makefile,application.mk則指明當前程序依賴的庫。
android.mk的示例為:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_first_app #指明C++程序編譯出的可執行程序的名稱
LOCAL_SRC_FILES:= my_first_app0.cpp \ #指明要編譯的源文件,可以有很多個
my_first_app1.cpp\
…
include$(BUILD_EXECUTABLE)#表明編譯的是可執行程序
/**************************************************************************/
application.mk的示例為:(在application.mk中指明STL庫)
APP_STL:= gnustl_static
這里選STL庫時有四個選項:
system - 使用默認最小的C++運行庫,這樣生成的應用體積小,內存佔用小,但部分功能將無法支持
stlport_static - 使用STLport作為靜態庫,這項是Android開發網極力推薦的
stlport_shared - STLport 作為動態庫,這個可能產生兼容性和部分低版本的Android固件,目前不推薦使用。
gnustl_static - 使用 GNU libstdc++ 作為靜態庫
默認情況下STLPORT是不支持C++異常處理和RTTI,所以不要出現 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static來支持標准C++的特性,但生成的文件體積會偏大,運行效率會低一些。
支持C++異常處理,在Application.mk中加入 LOCAL_CPPFLAGS +=
-fexceptions這句,同理支持RTTI,則加入LOCAL_CPPFLAGS +=
-frtti,這里再次提醒大家,第二條說的使用gnustl靜態庫,而不是stlport。
強制重新編譯 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以強制重新編譯STLPort源碼,由於一些原因可能自己需要修改下STLPort庫,一般普通的開發者無需使用此項
5、打開控制台(cmd),在myproject目錄下用android的NDK build工具編譯C++程序:
cd myproject
$NDK/ndk-build
如果程序沒錯的話,會編譯出android的可執行程序,位置在myproject/libs/armeabi/my_first_app
8、將編譯出來的my_first_app放到手機或是模擬器上運行。在windows的cmd上運行adb.exe。
用adb.exe將my_first_app程序push到手機或模擬器的/data/local目錄上:
adb.exepush myproject\libs\armeabi\my_first_app /data/local。
9、通過adb,在手機上運行my_frist_app:
在cmd上運行:
adb.exe shell
由此進入到手機的linux終端上,接下來再更改my_first_app的許可權使其可以運行:
cd /data/local
chmod 777 my_first_app
./my_first_app//如果沒錯的話,這一步即可運行my_first_app
至此在android上編譯含STL的C++程序的過程結束。