STLport如何在devcpp自带的mingw32下面编译??

supperbeyond 2003-04-06 01:30:50
如题
我现在使用的devcpp是4980,自带mingw32(gcc32),但是因为其自带的stl的wtring有问题,无法链接,所以改用stlport库。
在使用stlport4.5.3时,需要编译其iostream形成库文件,但是似乎其自带的gcc-mingw32.mak文件有问题,在make时出现命令错误,经过修改仍然无法解决问题。
请问有没有这方面经验的达人呢?还请赐教,不胜感谢
...全文
75 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaisave 2003-04-07
  • 打赏
  • 举报
回复
也找到一个说法:
http://www.geocrawler.com/mail/msg.php3?msg_id=9057201&list=6013
但是“说到底还是MS的c runtime的问题”似乎不通,难道BCB和MSVC就不用runtime了吗?@_@
不过supperbeyond(new) 的精神小弟pf,pf。
supperbeyond 2003-04-06
  • 打赏
  • 举报
回复
首先感谢大家的关注,尤其是chaisave,鞠躬感谢^_^

这两天我也一直在尝试编译stlport,为了达到我的目的(使用wstring),两天来通过在各个论坛上寻找资料,包括cygwin何mingw的老家的maillist都去翻了一遍,现在编译的问题总算是搞定了,同时还有一个不好的消息,cygwin和mingw32当前无法支持stl中的wstring与相关类型(搭配stlport也不行),因为libstdc++存在问题。mingw32的开发人员正在解决这个问题,我们只能等待。

接下来,就把怎么在windows平台下面编译cygwin和mingw32版本的stlport详细叙述如下:
=======================================

需要说明的是,首先,stlport-4.5.3自带的gcc-cygwin.mak和gcc-mingw32.mak不存在问题,只不过不能通过cmd或者dos环境编译。然后,在这两个编译器之下,stlport的编译存在大量的警告信息,包括一些unsinged int和int直接比较的警告,虽然不严重,但是也存在隐患。因此如果你需要做商业软件的开发的话,还请三思而行,毕竟,问题出在库上就不好办了。

现在我们进入正题:

1。stlport-4.5.3提供的mak文件都是用shell风格写成的,因此肯定不能在win cmd和dos环境下使用,需要编译的请先安装cygwin(http://www.cygwin.org)或者mingw32套件(包含mingw和msys http://mingw.sourceforge.net(mingw的那个org域名不能用了,还好有这个sf的域名))。安装必须保证能进入模拟的shell环境,还有必须使make能够运行。

2。将stlport-4.5.3解压缩到某处,比如c:\stlport-4.5.3(以下行文以此为例)

3。用文本编辑器打开c:\stlport-4.5.3\stlport\config\stl_gcc.h文件,这个文件中需要修改一下参数(不明白为什么stlport没来得及更新,ft),如下(250行左右位置)
---------------------------------------------------------------------------------
# if (__GNUC__ >= 3)

# define _STLP_NATIVE_INCLUDE_PATH ../g++-v3
//将这里改为
//define _STLP_NATIVE_INCLUDE_PATH ../c++/3.2 - for cygwin
//define _STLP_NATIVE_INCLUDE_PATH /mingw/include/c++/3.2 - for mingw32

# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../g++-v3/backward
//将这里改为
//define _STLP_NATIVE_INCLUDE_PATH ../c++/3.2/backward - for cygwin
//define _STLP_NATIVE_INCLUDE_PATH /mingw/include/c++/3.2/backward - for mingw32
---------------------------------------------------------------------------------
需要注意的是,上面的路径并不是绝对的,大家可以根据自己的情况更改,只要保证这个宏展开后的#include <_STLP_NATIVE_INCLUDE_PATH/cxxxx>能够正确定位即可。

在mingw中可以修改c:\msys\1.0\ext\fstab文件,将include文件的目录挂接到自己喜欢的地方,比如添加一行
c:\mingw\include /mingw/include
#将c:\mingw\include挂接到shell中的/mingw/include

4。完成了这一步之后,大家就可以打开shell,进入到stlport-4.5.3所在的目录,然后
cd src
make -f gcc-cygwin.mak clean all
...output lots of things....
make -f gcc-cygwin.mak install
...output lots of things....

对于mingw32只需要将mak文件换为gcc-mingw32.mak即可。
这些过程完成后,会在stlport-4.5.3下产生lib目录,里面有libstlport-xxxx.a的库,用于不同场合的链接。cygwin还会在/usr/local/中产生一个副本,分别是/lib和/stlport。

5。现在写一个hello,world程序
-<C:\Hello.cpp>-------------------------------------------------------------------#include <string>
#include <iostream>

using namespace std;

int main(int argi,char* argv[])
{
string s = "Hello,world!"
cout<<s<<endl;
return 0;
}
----------------------------------------------------------------------------------
在shell中运行
//in cygwin
g++ -I/usr/local/stlport -L/usr/local/lib/libstlport-cygwin.a Hello.cpp -o Hello.exe
//in mingw32
g++ -I/c/stlport-4.5.3/stlport -L/c/stlport-4.5.3/lib/libstlport-mingw32.a Hello.cpp -o Hello.exe
会发现stlport至此已经编译成功了。
至于在Dev-C++中使用,已经无大碍,只需要稍微设置一些路径即可。

6。但是如果这时将Hello.cpp改为如下
-<C:\Hello.cpp>-------------------------------------------------------------------#include <string>
#include <iostream>

using namespace std;

int main(int argi,char* argv[])
{
wstring s = L"Hello,world!"
wcout<<s<<endl;
return 0;
}
----------------------------------------------------------------------------------
执行命令
g++ -I/usr/local/stlport -L/usr/local/lib/libstlport-cygwin.a Hello.cpp -o Hello.exe
就会出现链接问题(wcout还存在编译问题),提示无法在库中找到w_char相关的东西。使用wstring终告失败。

我找了一下原因,发现同样在文件c:\stlport-4.5.3\stlport\config\stl_gcc.h中存在如下内容
----------------------------------------------------------------------------------
#if defined (__CYGWIN__) || defined (__MINGW32__) || !(defined (_STLP_USE_GLIBC) || defined (__sun))
#ifndef __MINGW32__
# define _STLP_NO_NATIVE_MBSTATE_T 1
#endif
# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
# define _STLP_NO_NATIVE_WIDE_STREAMS 1
# elif defined(__linux__)
# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
# define _STLP_NO_NATIVE_WIDE_STREAMS 1
# elif defined (__sun)
# define _STLP_WCHAR_BORLAND_EXCLUDE
# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
#endif
----------------------------------------------------------------------------------

看来mingw32开发人员说的不假,cygwin和mingw32确实存在问题,以至于stlport干脆定义了_STLP_NO_NATIVE_WIDE_FUNCTIONS以避免编译的失败。而mingw32人员的说法是,说到底还是MS的c runtime的问题。

看来,除了使用BCB或者MS的编译器,我们暂时是无法在cygwin和mingw32下面使用wstring了。

愿上帝保佑~~~
supperbeyond 2003-04-06
  • 打赏
  • 举报
回复
首先感谢大家的关注,尤其是chaisave,鞠躬感谢^_^

这两天我也一直在尝试编译stlport,为了达到我的目的(使用wstring),两天来通过在各个论坛上寻找资料,包括cygwin何mingw的老家的maillist都去翻了一遍,现在编译的问题总算是搞定了,同时还有一个不好的消息,cygwin和mingw32当前无法支持stl中的wstring与相关类型(搭配stlport也不行),因为libstdc++存在问题。mingw32的开发人员正在解决这个问题,我们只能等待。

接下来,就把怎么在windows平台下面编译cygwin和mingw32版本的stlport详细叙述如下:
=======================================

需要说明的是,首先,stlport-4.5.3自带的gcc-cygwin.mak和gcc-mingw32.mak不存在问题,只不过不能通过cmd或者dos环境编译。然后,在这两个编译器之下,stlport的编译存在大量的警告信息,包括一些unsinged int和int直接比较的警告,虽然不严重,但是也存在隐患。因此如果你需要做商业软件的开发的话,还请三思而行,毕竟,问题出在库上就不好办了。

现在我们进入正题:

1。stlport-4.5.3提供的mak文件都是用shell风格写成的,因此肯定不能在win cmd和dos环境下使用,需要编译的请先安装cygwin(http://www.cygwin.org)或者mingw32套件(包含mingw和msys http://mingw.sourceforge.net(mingw的那个org域名不能用了,还好有这个sf的域名))。安装必须保证能进入模拟的shell环境,还有必须使make能够运行。

2。将stlport-4.5.3解压缩到某处,比如c:\stlport-4.5.3(以下行文以此为例)

3。用文本编辑器打开c:\stlport-4.5.3\stlport\config\stl_gcc.h文件,这个文件中需要修改一下参数(不明白为什么stlport没来得及更新,ft),如下(250行左右位置)
---------------------------------------------------------------------------------
# if (__GNUC__ >= 3)

# define _STLP_NATIVE_INCLUDE_PATH ../g++-v3
//将这里改为
//define _STLP_NATIVE_INCLUDE_PATH ../c++/3.2 - for cygwin
//define _STLP_NATIVE_INCLUDE_PATH /mingw/include/c++/3.2 - for mingw32

# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../g++-v3/backward
//将这里改为
//define _STLP_NATIVE_INCLUDE_PATH ../c++/3.2/backward - for cygwin
//define _STLP_NATIVE_INCLUDE_PATH /mingw/include/c++/3.2/backward - for mingw32
---------------------------------------------------------------------------------
需要注意的是,上面的路径并不是绝对的,大家可以根据自己的情况更改,只要保证这个宏展开后的#include <_STLP_NATIVE_INCLUDE_PATH/cxxxx>能够正确定位即可。

在mingw中可以修改c:\msys\1.0\ext\fstab文件,将include文件的目录挂接到自己喜欢的地方,比如添加一行
c:\mingw\include /mingw/include
#将c:\mingw\include挂接到shell中的/mingw/include

4。完成了这一步之后,大家就可以打开shell,进入到stlport-4.5.3所在的目录,然后
cd src
make -f gcc-cygwin.mak clean all
...output lots of things....
make -f gcc-cygwin.mak install
...output lots of things....

对于mingw32只需要将mak文件换为gcc-mingw32.mak即可。
这些过程完成后,会在stlport-4.5.3下产生lib目录,里面有libstlport-xxxx.a的库,用于不同场合的链接。cygwin还会在/usr/local/中产生一个副本,分别是/lib和/stlport。

5。现在写一个hello,world程序
-<C:\Hello.cpp>-------------------------------------------------------------------#include <string>
#include <iostream>

using namespace std;

int main(int argi,char* argv[])
{
string s = "Hello,world!"
cout<<s<<endl;
return 0;
}
----------------------------------------------------------------------------------
在shell中运行
//in cygwin
g++ -I/usr/local/stlport -L/usr/local/lib/libstlport-cygwin.a Hello.cpp -o Hello.exe
//in mingw32
g++ -I/c/stlport-4.5.3/stlport -L/c/stlport-4.5.3/lib/libstlport-mingw32.a Hello.cpp -o Hello.exe
会发现stlport至此已经编译成功了。
至于在Dev-C++中使用,已经无大碍,只需要稍微设置一些路径即可。

6。但是如果这时将Hello.cpp改为如下
-<C:\Hello.cpp>-------------------------------------------------------------------#include <string>
#include <iostream>

using namespace std;

int main(int argi,char* argv[])
{
wstring s = L"Hello,world!"
wcout<<s<<endl;
return 0;
}
----------------------------------------------------------------------------------
执行命令
g++ -I/usr/local/stlport -L/usr/local/lib/libstlport-cygwin.a Hello.cpp -o Hello.exe
就会出现链接问题(wcout还存在编译问题),提示无法在库中找到w_char相关的东西。使用wstring终告失败。

我找了一下原因,发现同样在文件c:\stlport-4.5.3\stlport\config\stl_gcc.h中存在如下内容
----------------------------------------------------------------------------------
#if defined (__CYGWIN__) || defined (__MINGW32__) || !(defined (_STLP_USE_GLIBC) || defined (__sun))
#ifndef __MINGW32__
# define _STLP_NO_NATIVE_MBSTATE_T 1
#endif
# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
# define _STLP_NO_NATIVE_WIDE_STREAMS 1
# elif defined(__linux__)
# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
# define _STLP_NO_NATIVE_WIDE_STREAMS 1
# elif defined (__sun)
# define _STLP_WCHAR_BORLAND_EXCLUDE
# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
#endif
----------------------------------------------------------------------------------

看来mingw32开发人员说的不假,cygwin和mingw32确实存在问题,以至于stlport干脆定义了_STLP_NO_NATIVE_WIDE_FUNCTIONS以避免编译的失败。而mingw32人员的说法是,说到底还是MS的c runtime的问题。

看来,除了使用BCB或者MS的编译器,我们暂时是无法在cygwin和mingw32下面使用wstring了。

愿上帝保佑~~~
chaisave 2003-04-06
  • 打赏
  • 举报
回复
对不起,Makefile中应当是
PATH_SEP=\\
chaisave 2003-04-06
  • 打赏
  • 举报
回复
BTW,如果有谁搞定了DevCpp/mwing32-gcc3.2+STLPort,建议将此贴加到FAQ,
目前用Windowz+DevCpp/mwing32-gcc3.2而且想尝试STLPort的朋友肯定不少。
chaisave 2003-04-06
  • 打赏
  • 举报
回复
我试了一个下午,有一些进展,但是还有一些疑惑。
首先,gcc-mingw32.mak是给Cygwin下的gcc用的,win32下要用stlport+DevC++的mingw32/GCC3.2肯定得改Make和其他配置文件,
我的环境是devcpp4.980/mingw-gcc3.2,win2K prof,path包含DevCpp/bin,
为简单起见只make debug_static的stlport
下面简单说一下过程。
1.cd STLPort-4.5.3\src
copy gcc-mingw32.mak Makefile
2.
edit Makefile
把相应的宏改成下面所示:
RM=-rd /S /Q
PATH_SEP=\
MKDIR=-mkdir
4.edit STLPort-4.5.3\stlport\config\stl_gcc.h
# define _STLP_NATIVE_INCLUDE_PATH ../g++-v3
# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../g++-v3/backward
把上面的两个define改成DevC++的include路径,like
# define _STLP_NATIVE_INCLUDE_PATH \
../../DevC++/include/g++-v3
# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH \
../../DevC++/include/g++-v3/backward
5.cd STLPort-4.5.3\src;make debug_static;
试着make一下,她说:
子目录或文件 ..\\lib 已经存在。
make: [platform] Error 1 (ignored)
子目录或文件 ..\\lib\\obj 已经存在。
make: [platform] Error 1 (ignored)
子目录或文件 ..\\lib\\obj\\MINGW32 已经存在。
make: [platform] Error 1 (ignored)
make: *** No rule to make target `..\\lib\\obj\\MINGW32\\Debug\\dll_main.o', nee
ded by `..\\lib\\libstlport_mingw32_debug_static.a'. Stop.
6.edit cd STLPort-4.5.3\src\common_percent_rules.mak
(问题就在这里)
可以看到有一条适合的implicit rule,
$(DEBUG_OBJDIR_static)\\%.o : %.cpp
$(CXX) $(CXXFLAGS_DEBUG_static) $< -c -o $@
但是make就是不认,加上一条rule:
..\\lib\\obj\\MINGW32\\Debug\\dll_main.o: dll_main.cpp
$(CXX) $(CXXFLAGS_DEBUG_static) $< -c -o $@
dll_main.o算是编译出来了,但是还有一堆cpp还没编译,显然不能这样搞,
这方法太笨了。
后来down了一个gnu make 3.79.1,用MSVC6.0sp5编译通过,debug之,但是到晚上还没找到错在什么地方,faint。
有那位朋友知道gnu make 为什么会认为这条implicit rule不匹配那些.o文件呢,谢谢先。
aiyinsitan 2003-04-06
  • 打赏
  • 举报
回复
ding
robertnet 2003-04-06
  • 打赏
  • 举报
回复
gz

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧