GCC使用说明

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/.cppc/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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值