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++程序的过程结束。