c++宏定義、調用及編譯過程等

/*
//c++編譯器,對源文件的編譯實質就是對每個cpp都分別生成.obj,包括main.cpp.
但是main.cpp和其他的.cpp文件是有區別的。其他的.cpp可以直接include到各自的頭文件進行編譯。
而main.cpp即便包含了所有的其他頭文件,依然缺少main.cpp中函數及全局變量的定義,因爲只能include頭文件並不能include .cpp文件!
因此main.cpp在編譯生成main.obj時,對於這些僅有聲明的全局變量和函數僅僅是佔個位置。
基於以上的編譯過程,要想生成可執行文件,必須通過鏈接器,通過main.cpp中{}一行一行順序的去查找這些函數或變量的真正定義所在的位置
然後鏈接起來生成main.exe。這樣一來,main.cpp中的程序代碼就可以調用所有的在其他cpp文件定義的函數或全局變量。
main.cpp中包含的頭文件的功能就是給main.cpp中用到的外部的函數和變量一個聲明,進而可以進行佔位繼續編譯下去生成main.obj。

*/

#ifndef YOLO_V2_CLASS_HPP
//白色說明,此宏還沒被定義過
//紫色說明這裏是真的有效的宏定義
#define YOLO_V2_CLASS_HPP 
//可以這麼理解,如果這個宏是紫色的,那麼就代表這個宏在此或之前被定義了。

//宏定義的作用範圍是本文件,但是如果被定義帶頭文件裏,此頭文件又被包含,那麼宏定義對那些包含此頭文件的源文件都有效。
//這裏定義了YOLO_V2_CLASS_HPP 爲 "空"。

/*以上可以防止本頭文件被重複包含。我只是要用它防止重複包含,並沒有其他用處,所以用空來定義,而不是一個實數。
可移植性好,語言特性層次的。

*/
/*以上的功能還可以用控制編譯器的行爲來防止重複包含,那就是在程序頭文件前面加  #pragma once
效率更高,平臺相關的。
*/

//下面是如果沒有定義LIB_API才進入,說明已經定義了。

//  #Pragma argv   是控制編譯器的指令,
//可以控制編譯器忽略哪些錯誤提示 argv == warning,
//可以告訴編譯器在整個編譯過程中下面的頭文件只被編譯一次。argv == once
//可以用來將一個一個對象放入一個可執行文件或對象文件。  argv == comment(),如將lib文件包含到lib庫目錄。

//項目中有main函數依然可以打成dll庫,因爲在打庫的過程中,會進行入口重定義,定義到DLLmain(中間過程中默認完成的)

//VS中只是說庫目錄,其實包括靜態鏈接庫lib和動態庫dll了,因此我們在調用dll時,只需要將lib和dll放到一起,然後將此目錄加入到庫目錄中。

#ifndef LIB_API
#ifdef LIB_EXPORTS
#if defined(_MSC_VER)
#define LIB_API __declspec(dllexport)
#else
#define LIB_API __attribute__((visibility("default")))
//這種是Mac下的寫法,在window下等價於 "__declspec(dllimport)"
/*
__declspec(dllimport)有兩個作用:
第一:在編譯時有這個前綴,調用dll庫中的此函數時,直接尋找到這個函數的真正內存地址,一步到位編譯。
沒有這個前綴時,一般沒有問題,但是編譯時先生成這些函數佔位stub的obj文件。、

第二:如果要導入到dll庫中的類具有靜態成員函數時,那麼在調用dll庫時,不加__declspec(dllimport)前綴不能使用這些靜態成員函數
會提示"無法解析的外部符號”。

綜上,在不調用dll中類的靜態成員函數時,__declspec(dllimport)不是必須的!!!
*/
#include "darknet.h"
#include "yolo_v2_class.hpp"
//爲什麼darknet沒有這個頭文件和.cpp文件?  因爲darknet中有main函數起作用了,有函數入口。、
//而dll項目,是爲了將函數封裝到dll中,因此要將

#include "network.h"

/*
yolo_v2_class.cpp和yolo_v2_class.hpp已經是頂層的應用了。

yolo_v2_class.cpp的函數在daknet.src的基礎上就實現了檢測所有的功能。
其中有些函數時定義在此yolo_v2_class.cpp中的,      聲明在yolo_v2_class.hpp中。
還有一些函數時定義在其他文件中,              通過yolo_v2_class.cpp中的頭文件聲明。
還有一些函數定義在其他cpp文件中,     通過yolo_v2_class.cpp函數的頭文件中嵌套包含的頭文件聲明的。

*/

通過點擊 解決方案和文件夾 cmake目標視圖,可以很清楚的瞭解整個源碼的結構

都包括包含文件夾——include ,  以及源程序文件夾——src。

發佈了177 篇原創文章 · 獲贊 18 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章