码迷,mamicode.com
首页 > Windows程序 > 详细

STLport-5.2.1 STL port配置; cl.exe 编译cpp:ms和cygwin两种模式;cygwin环境配置和使用、GCC编译入门

时间:2014-11-26 01:25:44      阅读:699      评论:0      收藏:0      [点我收藏+]

标签:stl   sgi   cygwin   stlport   5.2.1   

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即可打印输出。


下面是转载链接:点击打开链接

目前已发现 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 搞反的,还有很多印刷错误就不一一列举了。当然书的内容还是很好的,只是看的时候得小心点。。。

STLport-5.2.1 STL port配置; cl.exe 编译cpp:ms和cygwin两种模式;cygwin环境配置和使用、GCC编译入门

标签:stl   sgi   cygwin   stlport   5.2.1   

原文地址:http://blog.csdn.net/jingzhewangzi/article/details/41469613

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!