今天帮朋友从Windows下移植一个小程序到Linux下,遇到了两个问题,在这里分享一下解决方法。
刚开始觉得,移植应该很简单,就是重新再Linux下编译一次就可以了。但是遇到了,不少问题。下面一一说明。
1、fopen_s()函数报错。
原因是,fopen_s()这个函数并不是标准的C++库中的函数,是微软特有的,也就是说如果你用VS编译不会有问题,但是如果你用Linux的g++或gcc就会报错。
解决办法,用fopen()代替。具体可参考:http://zhidao.baidu.com/link?url=8HhseVoTmwWpgmv-dsJyRjxt8sd1oJaqzZkJGzuJ_TKyNXbiEgs-EtPxie_xhfiwOY4uqojpKETCOugGZhrmCgt2pzLow2wq1urrVUCj0KS
FILE *fp;
fopen_s(&fp,BBC,"rb");
//改成如下
fp = fopen(BBC,"rb");
2、第二个问题是怎么样使用C++11的库。
我们知道,现在C++11标准已经使用很多了。那我们怎样在编译的时候指定使用C++11标准呢?
这里说两种情况:
1、g++,使用-std=c++11
g++ -std=c++11 test_slic.cpp slic.cpp -o test_slic.exe -L/home/sun/cmake/usr/lib/ -lopencv_core -lopencv_highgui -lopencv_imgproc -I/home/sun/Downloads/opencv-2.4.9/include -I/home/sun/cmake/t6/include
这里顺便解释下 -o 输出的目标文件,-L加入第三方库的路径, -l(小写L)第三方库的名字(注意写成libopencv_core.so 错误),-I(大写i)头文件搜素路径。我们看到-L,-l,-I可以是多个,而且和后面的路径之间没有空格。
2、Cmake 使用 set (CMAKE_CXX_STANDARD 11)
我们只需在CMakeLists.txt文件里加上set (CMAKE_CXX_STANDARD 11)就OK啦!很简单吧。
可参考:http://stackoverflow.com/questions/10851247/how-to-activate-c-11-in-cmake
http://stackoverflow.com/questions/14180397/creating-makefile-with-libraries/14180540#14180540