@CrazyHenry
2018-04-19T17:45:20.000000Z
字数 2430
阅读 1808
xxxxLinux命令行
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
gcc -c 1-1.c //这时源文件所在的目录将会生成 1-1.o 的文件
gcc -o 1-1 1-1.o //生成1-1的可执行文件
# 一步到位:
gcc -o 1-1 1-1.c
语法和gcc差不多,都可以使用上述指令。具体可以查阅官方文档。
gcc和g++的区别
gcc和g++都是GNU(组织)的一个编译器。
误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
可以参考:http://blog.163.com/lu_jun520/blog/static/5699613420116205148239/
[liyingmin@localhost cpp]$ ls
1-Flat.cpp 3-IVFPQ.cpp 5-Multiple-GPUs.cpp Makefile
2-IVFFlat.cpp 4-GPU.cpp CMakeLists.txt
[liyingmin@localhost cpp]$ g++ -o 1-Flat 1-Flat.cpp -L/usr/local/lib -lfaiss
[liyingmin@localhost cpp]$ ls
1-Flat 2-IVFFlat.cpp 4-GPU.cpp CMakeLists.txt
1-Flat.cpp 3-IVFPQ.cpp 5-Multiple-GPUs.cpp Makefile
[liyingmin@localhost cpp]$ ./1-Flat
./1-Flat: error while loading shared libraries: libfaiss.so: cannot open shared object file: No such file or directory
此时需要把这个.so文件写到Path中:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
source /etc/profile
然后就可以执行成功啦!
[liyingmin@localhost Desktop]$ cd cpp/
[liyingmin@localhost cpp]$ ls
1-Flat 2-IVFFlat.cpp 4-GPU.cpp CMakeLists.txt
1-Flat.cpp 3-IVFPQ.cpp 5-Multiple-GPUs.cpp Makefile
[liyingmin@localhost cpp]$ ./1-Flat
is_trained = true
ntotal = 100000
I=
0 371 187 551
1 324 126 279
2 213 260 487
3 199 402 626
4 388 839 222
D=
0 7.52398 7.56941 7.79739
0 7.15704 7.19868 7.25345
0 6.61889 6.96309 7.00845
0 7.001 7.11882 7.48969
0 7.14342 7.89587 7.9118
I (5 first results)=
486 287 1111 482
320 410 37 460
940 189 822 193
807 1002 388 505
657 156 95 1016
I (5 last results)=
10842 10827 9938 10004
9403 10267 10880 10330
9896 10146 10093 10361
8603 10523 10582 9895
11460 10123 11099 10876
当工程过于庞大,或者工程中需要include很多类似opencv这种库而担心编译链接出错的时候,就应该拿出makefile来编译C/C++工程了!
makefile就像是一系列gcc/g++指令写成一个脚本,然后执行make命令就可以执行这样的脚本完成整个编译过程。
可以参考:https://blog.csdn.net/hanfazy/article/details/16983695
cmake可以通过CMakeLists.txt文件,来生成相对应的makefile,因为CmakeList.txt的语法更简单,所以无需自己写makefile啦!当然是新手福音!