更多內容:
參考:https://github.com/TheErk/CMake-tutorial
初步
#include <stdlib.h>
#include <stdio.h>
void main(void)
{
printf("hello world!\r\n");
}
gcc hello.c -o hello.exe
分步:
ubuntu@ubuntu:~/Desktop/helloworldC$ ls
hello.c
ubuntu@ubuntu:~/Desktop/helloworldC$ gcc -E hello.c -o hello.i
ubuntu@ubuntu:~/Desktop/helloworldC$ ls
hello.c hello.i
ubuntu@ubuntu:~/Desktop/helloworldC$ gcc -S hello.i -o hello.s
ubuntu@ubuntu:~/Desktop/helloworldC$ gcc -c hello.s -o hello.o
ubuntu@ubuntu:~/Desktop/helloworldC$ ls
hello.c hello.i hello.o hello.s
ubuntu@ubuntu:~/Desktop/helloworldC$ gcc hello.o -o hello.exe
ubuntu@ubuntu:~/Desktop/helloworldC$ ./hello.exe
hello world!
參考:https://blog.csdn.net/weixin_33937778/article/details/92983969
使用 cmake
在歷史上工程師們曾使用 makefile 進行自動編譯,但下面要談的 cmake 比它更加方 便。並且,我們會看到後面提到的大多數庫都使用 cmake 來管理源代碼。
舉例: cmake 來製作一個工程
1、 建立CMakeLists.txt 文件
- 遵守 cmake 的語法
- 只有帶有 main 函數 的文件纔會生成可執行程序
- 而另一些代碼,打包供其他程 序調用,叫做庫
# 把工程調爲 Debug 編譯模式
set( CMAKE_BUILD_TYPE "Debug" )
# 聲明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 聲明一個 cmake 工程
project( HelloSLAM )
# 添加一個可執行程序
# 語法:add_executable( 程序名 源代碼文件 )
add_executable( helloSLAM helloSLAM.cpp )
2、build臨時目錄存放中間文件
新建了一箇中間文件夾“build”,然後進入 build 文件夾,通過 cmake ..
命令
mkdir build
cd build
3、cmake 會輸出 MakeFile。cmake 過程處理了工程 文件之間的關係
( MakeFile是一個自動化編譯的腳本,可以將它理解成一系統自動生成的編譯指令,而無須理會其 內容)。
cmake ..
4、 用 make 命令,make 過程實際調用了 g++ 來編譯程序
make
得到在 CMakeLists.txt 聲明 的那個可執行程序 hello 。
5、執行它:
./hello
6、用 cmake-make 的做法對項目的編譯管理工作,只需要維護若干個比較直觀的 CMakeLists.txt 文件
比如, 當 新增一個文件時,只需在 CMakeLists.txt 中添加一行“ add_XXX( 程序名 源代碼文件 ) ”命 令
cmake 生成庫
- OpenCV 庫提供了許多計算機視覺相關的算法
- Eigen 庫提供了矩陣代數的計算
1、文件
//這是一個庫文件
#include <iostream>
using namespace std;
void printHello()
{
cout<<"Hello"<<endl;
}
2、CMakeList.txt
新增一個可執行文件時, add_executable( helloRun hello.cpp )
添加靜態庫, add_library( hello MylibHello.cpp )
添加共享庫, add_library( hello_shared SHARED MylibHello.cpp )
cd build
cmake ..
make
在 build 文件夾中會生成一個 libhello.a 文件,libhello_shared.so 文件,這就是得到的庫
在 Linux 中,庫文件分成靜態庫(以.a 作爲後綴名)和共享庫(.so )兩種。靜態庫每次被調用都會生成一個副本, 而共享庫則只有一個副本。
3、.h頭文件
#ifndef LIBHELLO_H_
#define LIBHELLO_H_
void printHello();
#endif
4.1 、CMakeList 鏈接
add_executable( useHello useHello.cpp )
target_link_libraries( useHello hello_shared )
通過這兩句話,useHello 程序就能順利使用 hello_shared 庫中的代碼了
4.2 主函數調用
#include "libHello.h"
int main( int argc, char** argv )
{
printHello();
return 0;
}
IDE
MinGW + gmake + Notepad++
windows下的gcc有兩個版本mingw和cygwin,二選一就好
已學會C++,做工程,建議用mingw
用cygwin編譯後的二進制碼在別人機器上用不了,因爲其他人的機器沒有cygwin1.dll(安裝cygwin的時候會安裝,提供POSIX api和windows api之間的函數轉換)
學習C++,建議用cygwin
cygwin完整模擬了linux的運行環境,包括終端、bash、gcc、gdb、make等等,是一套完整的解決方案(mingw還需要自己配置最小linux環境,msys)
安裝過程:https://blog.csdn.net/u012450329/article/details/53813477