首先多謝大家的博客和前輩:老鷹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標準庫。
jingzhe@jingzhe-pc /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。請不要被我賴人路徑困擾。
下面是轉載鏈接:點擊打開鏈接
(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