IDE工具
控制终端
;
分号分隔VisualStudio 开发环境的设置
PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build
开发工具
编译器
cl 源代码
编译/链接为执行文件
/EHsc
/MD
/utf-8
/source-charset:utf-8
/execution-charset:utf-8
说明:
chcp 65001
链接器
/out
/MACHINE:X64
gk_math.h
#ifndef GK_MATH_H
#define GK_MATH_H
extern int gk_add(int, int);
#endif
gk_maath.cpp
#include "gk_math.h"
int gk_add(int p1, int p2){
return p1 + p2;
}
@rem 静态库的编译
@rem 编译
@cl /c /EHsc /MD /nologo /source-charset:utf-8 /execution-charset:utf-8 /Fo:gkmath.obj gk_math.cpp
@rem 静态库链接
lib /MACHINE:X64 /nologo /OUT:gkmath.lib gkmath.obj
使用shell脚本或者bat处理脚本,比较麻烦的是多个操作需要写成多个bat文件;实际引入一个专门的工程组织脚本Makefile;
工程组织的方式:
Makefile脚本的语法:Makefile
Makfile例子(分行符“\”之后一定不能有空格,不然会报错。)
CL_FLAGS = /c \
/EHsc \
/MD \
/nologo \
/source-charset:utf-8 \
/execution-charset:utf-8
LINK_FLAGS = /MACHINE:X64 \
/nologo
OBJS = gkmath.obj
SOURCES = gk_math.cpp
TARGETS = gkmath.lib
main:$(TARGETS) main.cpp
@ cl /nologo /MD /Fe:main.exe main.cpp $(TARGETS)
$(TARGETS):$(OBJS)
@lib $(LINK_FLAGS) /OUT:$(TARGETS) $(OBJS)
$(OBJS): gk_math.h gk_math.cpp
@cl $(CL_FLAGS) /Fo:$(OBJS) $(SOURCES)
clean:
@del *.exe *.obj *.lib 2>/Nul
#include
#include "gk_math.h"
int main(int argc, char **argv, char **arge){
printf("C++程序编程!静态库调用结果:%d\n", gk_add(45, 55));
return 0;
}
CL_FLAGS = /c \
/EHsc \
/MD \
/nologo \
/source-charset:utf-8 \
/execution-charset:utf-8
LINK_FLAGS = /MACHINE:X64 \
/nologo
OBJS = gkmath.obj
SOURCES = gk_math.cpp
TARGETS = gkmath.lib
main:$(TARGETS) main.cpp
@ cl /nologo /MD /Fe:main.exe main.cpp $(TARGETS)
$(TARGETS):$(OBJS)
@lib $(LINK_FLAGS) /OUT:$(TARGETS) $(OBJS)
$(OBJS): gk_math.h gk_math.cpp
@cl $(CL_FLAGS) /Fo:$(OBJS) $(SOURCES)
clean:
@del *.exe *.obj *.lib 2>/Nul
#include
#include "gk_math.h"
#pragma comment(lib, "gkmath.lib")
int main(int argc, char **argv, char **arge){
printf("C++程序编程!静态库调用结果:%d\n", gk_add(45, 55));
return 0;
}
// cl /nologo /MD /Fe:main.exe main_lib.cpp
cl /nologo /MD /Fe:main.exe main_lib.cpp
cl编译器 (mac:clang/g++,posix:gnu g++,hp:acc: intel:cc, sun:cc)
link连接器(posix:ld)
lib(ar)
dumpbin(nm)
nmake(make)
#ifndef GK_MATH_H
#define GK_MATH_H
extern int gk_add(int, int);
#endif
#include "gkmath.h"
int gk_add(int p1, int p2){
return p1 + p2;
}
准备:link选项
= /DEF:DEF导出函数的描述文件
编译脚本
# 编译选项设置一个变量
CL_ARGS=/EHsc /MD /source-charset:utf-8 /execution-charset:utf-8 /nologo
# 链接选项设置一个变量
LINK_ARGS=/MACHINE:X64 /NOLOGO /DLL
# 文件设置成变量
SOURCES = gkmath.cpp
OBJS = gkmath.obj
OUTLIBS = gkmath.lib
OUTDLLS = gkmath.dll
# 目标指令实现
$(OUTDLLS):$(SOURCES)
@cl /c $(CL_ARGS) /Fo:$(OBJS) gkmath.cpp
@link /MACHINE:X64 /NOLOGO /DLL /OUT:$(OUTDLLS) /IMPLIB:$(OUTLIBS) /EXPORT:gk_add $(OBJS)
clean:
@del *.obj *.lib *.dll *.ilk *.exe *.exp 2>/Nul
直接使用dll调用函数(lib根本不需要,只需要dll) 【不推荐】
准备技术:
代码实现
call_manual_dll.cpp
#include
#include
// typedef int(*type_f)(int,int);
int main(int argc, const char**argv){
// 加载dll模块
HMODULE h = LoadLibraryA("gkmath.dll");
if (h == NULL){
printf("加载失败!\n");
return -1;
}
printf("加载成功!");
// 查找函数
FARPROC f = GetProcAddress(h, "gk_add"); // ?gk_add@@YAHHH@Z
printf("%p\n", f);
// 类型转换
// type_f myfunc = (type_f)f;
int (*myfunc)(int, int) = (int(*)(int, int))f;
// 调用
printf("结果:%d\n", myfunc(45,55));
// 释放模块
FreeLibrary(h);
}
build.bat
@cl /c /utf-8 /nologo /MD /Fo:call_manual_dll.obj call_manual_dll.cpp
@link /NOLOGO /OUT:main.exe /DYNAMICBASE Kernel32.lib call_manual_dll.obj
编译
/I : 指定头文件的路径
call_auto_dll.cpp
#include
#include "gkmath.h"
#pragma comment(lib, "gkmath.lib") //不推荐
int main(int argc, const char*argv[]){
printf("调用结果: %d\n", gk_add(55,55));
return 0;
}
Makefile
# 编译选项设置一个变量
CL_ARGS=/EHsc /MD /source-charset:utf-8 /execution-charset:utf-8 /nologo
# 链接选项设置一个变量
LINK_ARGS=/MACHINE:X64 /NOLOGO /DLL
# 文件设置成变量
SOURCES = gkmath.cpp
OBJS = gkmath.obj
OUTLIBS = gkmath.lib
OUTDLLS = gkmath.dll
# 目标指令实现
$(OUTDLLS):$(SOURCES)
@cl /c $(CL_ARGS) /Fo:$(OBJS) gkmath.cpp
@link /MACHINE:X64 /NOLOGO /DLL /OUT:$(OUTDLLS) /IMPLIB:$(OUTLIBS) /EXPORT:gk_add $(OBJS)
clean:
@del *.obj *.lib *.dll *.ilk *.exe *.exp 2>/Nul
main:call_auto_dll.cpp
@cl /c $(CL_ARGS) /Fo:main.obj call_auto_dll.cpp
@link /OUT:main.exe /DYNAMICBASE gkmath.lib main.obj
main1:call_auto_dll.cpp
@cl /c $(CL_ARGS) /Fo:main1.obj call_auto_dll.cpp
@link /OUT:main1.exe main1.obj
掌握的重点:
在 “${workspaceFolder}/",之后加入路径
比如"C:/Qt/Qt-5.14.0/include/”
Qt程序
#include
// Qt GUI模块:QtWidgets
// Qt 底层模块:QtCore
// Qt 图形的绘制模块QtGui
#include
#include
int main(int argc, char **argv){
// 1. 构建Qt应用:QApplication
QApplication app(argc, argv);
// 2. 窗体创建QDialog
QDialog dlg;
// 窗体的属性(函数对getter/setter)
dlg.setWindowTitle("Qt开发");
dlg.resize(640, 480);
dlg.move(200,200);
dlg.show();
// 3. 消息循环处理int QApplication.exec()
int status = app.exec(); // block函数(消息循环)
// 4. 退出程序,返回状态码给系统0-255(-1=255)
return status;
}
// dll所在的路径,必须设置到PATH环境变量
INCLUDES = /I "C:\Qt\Qt-5.14.0\include"
LIBS = /LIBPATH:"C:\Qt\Qt-5.14.0\lib" \
/DYNAMICBASE \
"Qt5Widgetsd.lib" \
"Qt5Guid.lib" \
"Qt5Cored.lib"
CL_ARGS = /EHsc \
/MDd \
/source-charset:utf-8 \
/execution-charset:utf-8 \
/nologo
LINK_ARGS = /MACHINE:X64 /NOLOGO
main:qmain.cpp
@cl /c $(CL_ARGS) /Fo:main.obj $(INCLUDES) qmain.cpp
@link $(LINK_ARGS) $(LIBS) /OUT:main.exe main.obj
clean:
@del *.exe *.obj *.exp 2>/Nul
cmake configure
generate
VS2019 打开:BUILD_ALL / INSTAL
1.made,转专业成为程序员,之前没学过C++,完全懵逼的状态好吗…然后发现有时候安装程序也是程序员的一大难关,但是经过之后的消化之后,这些内容变得稍微能接受一点。Just keep going.