[关闭]
@CrazyHenry 2018-04-19T17:45:20.000000Z 字数 2430 阅读 1808

GCC/G++和Cmake/make/Makefile

xxxxLinux命令行


1.Gcc

  1. gcc -c 1-1.c //这时源文件所在的目录将会生成 1-1.o 的文件
  2. gcc -o 1-1 1-1.o //生成1-1的可执行文件
  3. # 一步到位:
  4. gcc -o 1-1 1-1.c

2.G++

语法和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/

  1. [liyingmin@localhost cpp]$ ls
  2. 1-Flat.cpp 3-IVFPQ.cpp 5-Multiple-GPUs.cpp Makefile
  3. 2-IVFFlat.cpp 4-GPU.cpp CMakeLists.txt
  4. [liyingmin@localhost cpp]$ g++ -o 1-Flat 1-Flat.cpp -L/usr/local/lib -lfaiss
  5. [liyingmin@localhost cpp]$ ls
  6. 1-Flat 2-IVFFlat.cpp 4-GPU.cpp CMakeLists.txt
  7. 1-Flat.cpp 3-IVFPQ.cpp 5-Multiple-GPUs.cpp Makefile
  8. [liyingmin@localhost cpp]$ ./1-Flat
  9. ./1-Flat: error while loading shared libraries: libfaiss.so: cannot open shared object file: No such file or directory

此时需要把这个.so文件写到Path中:

  1. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
  2. export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
  3. source /etc/profile

然后就可以执行成功啦!

  1. [liyingmin@localhost Desktop]$ cd cpp/
  2. [liyingmin@localhost cpp]$ ls
  3. 1-Flat 2-IVFFlat.cpp 4-GPU.cpp CMakeLists.txt
  4. 1-Flat.cpp 3-IVFPQ.cpp 5-Multiple-GPUs.cpp Makefile
  5. [liyingmin@localhost cpp]$ ./1-Flat
  6. is_trained = true
  7. ntotal = 100000
  8. I=
  9. 0 371 187 551
  10. 1 324 126 279
  11. 2 213 260 487
  12. 3 199 402 626
  13. 4 388 839 222
  14. D=
  15. 0 7.52398 7.56941 7.79739
  16. 0 7.15704 7.19868 7.25345
  17. 0 6.61889 6.96309 7.00845
  18. 0 7.001 7.11882 7.48969
  19. 0 7.14342 7.89587 7.9118
  20. I (5 first results)=
  21. 486 287 1111 482
  22. 320 410 37 460
  23. 940 189 822 193
  24. 807 1002 388 505
  25. 657 156 95 1016
  26. I (5 last results)=
  27. 10842 10827 9938 10004
  28. 9403 10267 10880 10330
  29. 9896 10146 10093 10361
  30. 8603 10523 10582 9895
  31. 11460 10123 11099 10876

3.make/makefile

当工程过于庞大,或者工程中需要include很多类似opencv这种库而担心编译链接出错的时候,就应该拿出makefile来编译C/C++工程了!
makefile就像是一系列gcc/g++指令写成一个脚本,然后执行make命令就可以执行这样的脚本完成整个编译过程。

可以参考:https://blog.csdn.net/hanfazy/article/details/16983695

4.Cmake/CMakeLists.txt

cmake可以通过CMakeLists.txt文件,来生成相对应的makefile,因为CmakeList.txt的语法更简单,所以无需自己写makefile啦!当然是新手福音!

可以参考官网:https://cmake.org/cmake-tutorial/

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注