天天看點

STLport-5.2.1 STL port配置; cl.exe 編譯cpp:ms和cygwin兩種模式;cygwin環境配置和使用、GCC編譯入門

首先多謝大家的部落格和前輩:老鷹2498472937的提點,要不然不知道還要在環境上花費多少時間。

1、在ms中要使用windows sdk和相關的lib設定實在太麻煩啦,以及dll等檔案缺失是在嚴重。是以我簡單地利用了vs安裝目錄下的批處理檔案,在指令視窗中進入:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC ,直接運作vcvarsall.bat加載vs中以及配置好的環境,就可以使用指令行: cl -GX hello.cpp去實作編譯并運作。2012版本的vs中-GX換成-EHsc。同理我也可以使用vs2013。目前vs2013的環境我主要用于測試C++11的文法,出現不通過或不是期望結果情況下我才會切換環境。

如果覺得我獲得最快的解決方式這篇部落格就結束了?

模仿作為人類站在巨人的肩膀上這麼神奇的技能,我當然也是不甘落後。

既然vs的環境配置是正确的,就把它的抽出來:

set path=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A;
set include=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;
set lib=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib;
set 
           

目前運作時的dll庫(待續。。),應該和path使用同一個路徑。 注:可通路本人另外一篇部落格介紹vs的路徑問題。

而要忽略的路徑則需要使用cl的參數去編譯,目前還是個小菜,隻會使用簡單的生成指令,還不會寫一個完善的Makefile。

當我用這套環境去嘗試着編譯STLport工程時,出現cl.exe直接退出的情況。是以最後我還使用了VS自帶的環境設定批處理指令:vcvarsall.bat,在vs2012的樣例:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat 。在目前的指令視窗中運作此檔案,加載環境設定,就可以編譯STLport-5.2.1工程。

參考連結:VS2010使用STLport-5.2.1 摘錄内容:

configure msvc9(configure msvc10 會顯示 Unknown compiler: msvc10, msvc9即可)
           

定格,時間:2014年11月25号。目前STLport原生工程時沒有配置vs2012、vs2013,意味着這個stl庫對C++11的支援度不會很高,但是要知道對于C++99/03的标準,VS08、10、12都是相容的。是以即便我們不是vs08即msvc9的版本,也是可以編譯這個工程(不排除有點小文法錯誤,但是我們都可以憑着自己C++、STL知識去處理這種編譯報錯,我配置的時候隻有文法報錯,修改一下就可用了)。

接下來要用到nmake工具,這個時候就發現我自己抽出來的環境編譯直接退出。糟糕,忘記記錄錯誤資訊啦。待續

基于此情況,我用回了vs自帶的編譯變量設定,然後完成了STLport-5.2.1的編譯。

2、cygwin環境使用

先把參考或者有用的文章标記一下:

百度文庫關于cygwin環境介紹 Unix環境cygwin安裝以及使用介紹  cygwin安裝細節以及gcc編譯指令 百度經驗中關于STLport開發環境配置文章

GCC-makefile入門 還有一個Makefile入門的教程:跟我一起學寫Makefile

基礎指令,主要在于利用轉義符實作完整路徑的輸入:

$ cygpath -w /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE c:\Program Files\Internet Explorer\IEXPLORE.EXE
           

gcc的編譯例子如下:

#include<iostream>
using namespace std;


int main(int argv,char ** argc)
{
	cout<<"hello world,cygwin"<<endl;
	return 0;
}
           

接下來要使用cygwin的環境去編譯目标檔案。因為使用stl,必須使用g++的編譯指令:g++ hello.cpp //已經在該路徑下,未使用指令符操作去編譯

編譯完成之後,運作發現環境不對,缺少dll。這個問題一般有幾種解決方案:

1)複制dll

2)通過設定window path環境變量

3)預編譯處理。目前時間點,我嘗試着使用了g++ -mno-cygwin hello.cpp去編譯,發現編譯失敗,不支援。待續

3、使用Makefile去編譯另外一個小項目,來自參考連結的方式,使用的是我自己的代碼

makefile内容:

#jingz's first file to test makeFile
allTarget:stdafx_target 11_12_target
	g++ stdafx.o 11_12.o -o 11_12.exe
#remove the object files
	rm -rf stdafx.o 11_12.o
#complie the cpps into objects
stdafx_target:
	g++ -c stdafx.cpp -o stdafx.o
11_12_target:
	g++ -c 11_12.cpp -o 11_12.o
           

編譯的時候會遇到一些問題,比如标準之間識别問題,tchar的配置問題。需要我們自己去配置可用的STL标準庫。

[email protected] /cygdrive/d/Cpp_lab_linux/11_12
$ make
g++ -c stdafx.cpp -o stdafx.o
g++ -c 11_12.cpp -o 11_12.o
11_12.cpp: 在函數‘int main()’中:
11_12.cpp:23:15: 錯誤:‘nullptr’在此作用域中尚未聲明
  int * temp = nullptr;
               ^
makefile:10: recipe for target '11_12_target' failed
make: *** [11_12_target] Error 1
           

cygwin模拟unix的的UI操作。exe是可執行檔案,執行方式和linux的一樣./11_12即可列印輸出。

在VS項目中配置STLport的細節如下:引用目錄好像是預編或者,指令編譯傳參相關的,我不熟悉,就沒有去測試,運作時目錄是dll,庫目錄則是lib。請不要被我賴人路徑困擾。

STLport-5.2.1 STL port配置; cl.exe 編譯cpp:ms和cygwin兩種模式;cygwin環境配置和使用、GCC編譯入門

下面是轉載連結:點選打開連結

目前已發現 VC 9.0 所帶 STL 的幾處缺陷,為了保證在任何 C++ 編譯器中使用 STL 時能夠表現一緻,決定将标準庫都統一為 STLport 。 MinGW 下則是為了使用 wstream 的寬字元流。 大緻記錄下編譯過程,以後也能做個參考。 編譯版本 STLport-5.2.1   一、VS2008 (MSVC 9.0) 下     (1) 将壓縮包解到某檔案夾,如 D:\STLport (路徑中無空格)     (2) 啟動 VS2008 的指令行模式。(注意不是 Run... 中的 cmd)          cd D:\STLport     (3) configure msvc9 -x --with-static-rtl --use-boost D:\lib\boost_1_36_0          msvc9 指明編譯器          -x 參數指明是 cross-compile ,在 lib 檔案夾下會生成一個 vc9 檔案夾。加不加無所謂。          --with-static-rtl 指明編譯靜态庫,編譯器參數選擇 /MT 時會使用此庫。                  若是需要動态庫則改為 --with-dynamic-rtl                  經試驗好像沒法同時編譯動态和靜态庫。一次一種也無所謂。                  但是選擇編譯靜态庫時也會生成動态庫的檔案,不過那些是不可用的,檔案名中也有 x 字母表示無效檔案          --use-boost 指明 boost 庫的路徑。僅使用一下 boost 的幾個頭檔案,是以無需事先編譯 boost。路徑中不要有空格,不然很麻煩     (4) cd build\lib          切換到 build\lib 子目錄     (5) nmake /fmsvc.mak install          開始編譯。需要待一會兒。完成後會在 STLport\lib 和 STLport\bin (動态庫時) 下生成 LIB 和 DLL 檔案。     (6) 啟動 VS2008 設定 include 目錄。注意把 STLport\stlport 的位置放在 VC 自帶的 STL 庫的前面。完畢~   ---------------------------- 2009.11.1 補充: 最近根據需要又重新編譯了一遍 STLport,發現以前寫的這篇文章有幾個問題。 先是關于 --use-boost 的選項。STLport 在 5.2.1 版上已經停留好久了,而這期間,boost 的版本從 1.36.0 變動到 1.40.0 ,是以 STLport 中 --use-boost 的選項貌似和新版 boost 已經不能很好的協作了。是以不要再指定這個選項即可,本來這個對 Win32 VC 來說就不是很有必要。 其次關于 --with-static-rtl 和 --with-dynamic-rtl ,以前了解是有誤的。 --with-static-rtl 這個指明編譯時靜态連結到 VC 的 C runtime library (即 libcmt.lib),這樣編譯出來的庫,我們以後在 build 自己的程式時選擇 /MT 選項會用到。如果沒有其他改動的話,預設也是靜态連結到 stlport 庫的,如果想要靜态連結到 C runtime library 的同時,動态連結到 stlportxx.dll ,那麼在自己的項目屬性中添加 _STLP_USE_DYNAMIC_LIB 的預定義宏即可。此時會用到帶有字母 x 的生成檔案(在上面說帶 x 的是無效檔案,是因為當時不會用,呵呵。) --with-dynamic-rtl 這個指明編譯時動态連結到 VC 的 C runtime library (即 MSVCxxx.lib MSVCP90.dll),這樣編譯出來的庫,我們以後在 build 自己程式時選擇 /MD 選項會用到。如果沒有其他改動的話,預設也是動态連結到 stlport 庫(依賴 stlport.5.2.dll),如果想動态連結到 C runtime library 的同時,靜态連結到 stlportxx.lib ,那麼在項目屬性中添加 _STLP_USE_STATIC_LIB 的預定義宏即可。(此時也會用到帶 x 字母的另一些檔案。)   現在編譯的話,直接這麼做: (1) configure msvc9 -x --with-dynamic-rtl (2) 切換到 build/lib 目錄,nmake /fmsvc.mak install clean (3) configure msvc9 -x --with-static-rtl (4) 切換到 build/lib 目錄,nmake /fmsvc.mak install clean 完畢~ 生成檔案在 /lib/vc9 和 /bin/vc9 目錄下。   STLport 用起來真的很爽,效率比 VC9 自帶的 STL 庫高不少,特别對于 C++ 的 stream IO 操作優化很好,基本上都可以超過 C 庫函數的效率。 ----------------------------------------   不過在 VC 中使用 STLport 也發現點小問題,主要是和 VC 的調試器配合不好,因為 STLport 中一些标準容器的結構變得比較複雜,好像沒法在單步調試時友善的觀察資料變化。   二、MinGW (GCC 3.4.5) 下         (1) start MSYS & cd /lib/STLport-5.2.1

        (2) configure --with-boost=/lib/boost_1_36_0

            # 設定 boost 路徑時中間不要有空格,不然後面會很難辦

        (3) cd build/lib

        (4) mingw32-make -f gcc.mak all

            # 要用 mingw 帶的那個 make,不要用 MSYS 的那個

            # 編譯好後把 .a 和 .dll 檔案分别複制到 stlport/lib 和 stlport/bin

            # all 選項預設 build 所有動态庫,要編譯靜态庫須如下步指定:

        (5) mingw32-make -f gcc.mak release-static dbg-static stldbg-static

            # 編譯三種靜态庫。同樣把 .a 檔案複制到 stlport/lib

        (6) 設定 MinGW 的 include:

            這個貌似隻能在編譯時指定參數 -I 和 -L

        (7) 使用時的參數

            --動态連結:

                g++ xxx.cpp -mthreads -I /lib/STLport5.2.1/stlport -L /lib/STLport5.2.1/lib/mingw -lstlport.5.2

            --靜态連結:

                在源檔案開頭添加:#define _STLP_USE_STATIC_LIB

                g++ xxx.cpp -mthreads -I /lib/STLport5.2.1/stlport -L /lib/STLport5.2.1/lib/mingw -lstlport

                    # 與動态連結版相比最後的庫名不帶版本号

                    # 要連結 debug 版隻需把最後的庫名改為相應名稱即可,如 -lstlportg     本來一個月前就寫好的。。。結果拜某節日所賜那幾天 Space live 被封。。。然後居然拖了這麼久 = = 還是懶啊~   然後再發點牢騷。看中文書一般總說裡面錯誤成堆措辭不準确什麼的,說計算機書都去看原版品質多高,結果這本按說也是 STL 标準學習手冊的《C++ Stardand Library : A Tutorial and Reference》裡也是錯誤頻頻,什麼樣的都有。。。函數名寫錯、算法寫錯、時間複雜度寫錯、函數傳回值true false 搞反的,還有很多印刷錯誤就不一一列舉了。當然書的内容還是很好的,隻是看的時候得小心點。。。