gcc/g++编译器参数
c++代码文件需要经过预处理、编译、汇编、链接四个步骤生成可执行文件
核心参数
参数 | 说明 | 示例 |
---|---|---|
E | (预处理:)仅生成预处理文件(.i/.ii)就停止运行 | g++ -E main.cpp -o main.ii |
S | (编译:)仅激活预处理和编译,将文件编译成汇编代码 | g++ -S main.cpp -o main.s |
c | (汇编:)预处理、编译后将汇编代码替换成目标的机器语言 | g++ -c main.s -o main.o |
(链接:)链接目标机器语言,生成可执行文件 | g++ main.o -o main | |
o | 指定目标名称 | |
g | 生成调试信息文件,可供GNU调试器使用 |
链接库文件相关参数
参数 | 说明 | 示例 |
---|---|---|
I(大写i) | 指定额外的的头文件搜索目录 | |
L | 指定额外的库文件搜索路径 | g++ main.cpp -L ./dlls/ -o main |
l(小写L) | 链接指定的库文件 | g++ main.cpp -lhello -o main |
注:动态库的名称为libhello.dll,在-l参数后面只需写hello即可 |
g++生成dll文件相关参数
参数名称 | 说明 | 示例 |
---|---|---|
shared | 尽量使用动态库,生成的文件比较小 | |
static(暂不讨论) | 禁止使用动态库,生成的文件比较大 | |
fPIC | 使用地址无关代码,具体解释请参考fPIC专题 |
fPIC参数专题
使用动态库就必须使用fPIC参数
参考:https://www.cnblogs.com/cswuyg/p/3830703.html
代码优化相关参数
参数 | 说明 | 示例 |
---|---|---|
O0 | 不进行优化处理 | |
O/O1 | 优化生成代码 | |
O2 | 进一步优化 | |
O3 | 比O2更进一步优化,包括inline |
文件后缀
后缀 | 说明 |
---|---|
.c/.cpp | c/c++源文件 |
.i | 预处理后的c文件 |
.ii | 预处理后的cpp文件 |
.s/.S | 汇编语言源程序 |
.o | 目标机器语言 |
g++生成dll源代码:
hello.h
#ifndef STRING_HELLO_H
#define STRING_HELLO_H
#include <iostream>
extern "C" __declspec(dllexport) void sayhello();
extern "C" __declspec(dllexport) void sayworld();
#endif //STRING_HELLO_H
hello.cpp
#include "includes/hello.h"
void sayhello(){
std::cout << "hello!" << std::endl;
}
void sayworld(){
std::cout << "world!" << std::endl;
}
g++ -o ./dlls/libhello.dll hello.cpp -shared -fPIC
解释:在dlls目录下生成动态库文件libhello.dll
g++ hello.cpp -o ./libs/libhello.lib -shared -fPIC
解释:在libs目录下生成静态库文件libhello.lib
g++调用动态库dll文件
main.cpp
#include <Windows.h>
using namespace std;
int main(int argc, char* argv[]){
typedef void (*hello_ptr)();
typedef void (*world_ptr)();
HMODULE hmodle = LoadLibrary(__TEXT("./dlls/libhello.dll"));
if (hmodle != NULL)
{
hello_ptr hello = (hello_ptr) GetProcAddress(hmodle, "sayhello");
if(hello!=NULL)
hello();
world_ptr world = (world_ptr) GetProcAddress(hmodle, "sayworld");
if(world!=NULL)
world();
}
return 0;
}
g++ -o main main.cpp -L ./dlls/ -lhello
g++调用静态库lib文件
main.cpp
#include "includes/hello.h"
using namespace std;
int main(int argc, char* argv[]){
sayhello();
sayworld();
return 0;
}
g++ main.cpp ./libs/libhello.lib -o main