当前位置: 首页 > news >正文

pe管网站建设 中企动力大地资源在线视频资源

pe管网站建设 中企动力,大地资源在线视频资源,docker wordpress安装目录,商丘网站制作教程1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…

1. 前提


    这篇文章记录一下怎么用CMake进行项目管理, 并用C/C++和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件
在这里插入图片描述
由于大部分人不会使用C/C++与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的记录

2. 配置

创建一个cmake工程
在这里插入图片描述
VS是支持多个工程在一个解决方案中的, 目前使用的是单工程。这是我习惯的目录树:在这里插入图片描述
解释一下其中含义:

  • include: 所有头文件都将放在这个目录下
  • src: 所有源文件都将放在这个目录下
  • out/build: 构建项目所生产的中间文件
  • install: 最终工程所生产的可执行文件以及库文件, 和必须的文件, 这是最终使用部分可以直接打包
  • scripts: 辅助编译链接的脚本

下面我将先用cmake脚本配置一个cpp项目:

首先看一下目录树:在这里插入图片描述
CMakeLists.txt编写:

# cmake的最低版本要求是3.8
cmake_minimum_required (VERSION 3.8)# 项目名称
project (TestJoke)# 设置默认安装路径
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install" CACHE PATH "默认安装路径" FORCE)
endif()# 生成可执行文件, 并使用main.cpp和arthmetic.cpp
add_executable(TestJoke main.cpp src/calc/arthmetic.cpp)# 将include/calc包含进头文件目录内
target_include_directories(TestJoke PRIVATE "${CMAKE_SOURCE_DIR}/include/calc")# 生成的目标放到install/bin目录下
install(TARGETS TestJoke DESTINATION bin)# 执行命令TestJoke, 依赖是TestJoke生成, 也就是说TestJoke生成后立马执行TestJoke
add_custom_command(TARGET TestJokeCOMMAND TestJoke DEPENDS TestJoke 
)

arthmetic.h编写:

#pragma once #ifdef __cplusplus
extern "C" {
#endif int add(int iNum1, int iNum2);int sub(int iNum1, int iNum2);int div1(int iNum1, int iNum2);int mul(int iNum1, int iNum2);#ifdef __cplusplus
}
#endif 

arthmetic.h编写:

#include "arthmetic.h"int add(int iNum1, int iNum2)
{return(iNum1 + iNum2);
}int sub(int iNum1, int iNum2)
{return(iNum1 - iNum2);
}int div1(int iNum1, int iNum2)
{return(iNum1 / iNum2);
}int mul(int iNum1, int iNum2)
{return(iNum1 * iNum2);
}

main.cpp编写:

#include <windows.h>
#include <cstdio>
#include <cstdlib>
#include "arthmetic.h"int main()
{printf("%d", add(12, 8));system("pause");return(0);
}

build.bat脚本编写:

@echo off:: 保存原本的环境变量
setlocal:: 进入out/build构建目录
set BUILD_PATH=%~dp0../out/build/
pushd "%BUILD_PATH%":: 以x86 Debug方式构建项目
cmake ../.. -DCMAKE_BUILD_TYPE=Debug -G "Visual Studio 17 2022" -A Win32 
cmake --build . --config Debug 
:: 将生成内容安装
cmake --install . --config Debug :: 回到原来目录
popd 
:: 恢复原本的环境变量
endlocal 

完成之后进入scripts目录执行build.bat脚本就可以发现执行成功了
在这里插入图片描述
执行成功后, 可执行文件被安装到了install/bin/目录下, 构建文件在out/build/目录下生成
在这里插入图片描述
下面将进行汇编语言的配置, 首先去masm32下载对应的sdk: 下载masm32 sdk

添加汇编代码后的目录树:
在这里插入图片描述
stupid.asm内容:

.586
.model flat, C
option casemap:noneinclude windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib.data
szCap SBYTE '测试', 0
szMsg SBYTE '这是一个测试', 0.code
MsgBox PROC pszMsg:PTR SBYTE, pszCap:PTR SBYTEpush MB_OKpush pszCappush pszMsg push NULLcall MessageBoxret 
MsgBox ENDP
END

完成之后就可以对cmake进行配置
主要是将masm32 SDK的库文件和头文件加入cmake环境变量中
CMakeLists.txt修改后:

# cmakee的最低版本要求是3.8
cmake_minimum_required (VERSION 3.8)# 项目名称
project (TestJoke)# 允许基于masm的Intel汇编
enable_language(ASM_MASM)# 设置默认安装路径
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install" CACHE PATH "默认安装路径" FORCE)
endif()# 包含masm32 sdk的头文件目录
include_directories(D:/masm32/include)
# 包含masm32 sdk的库文件目录
link_directories(D:/masm32/lib)# 生成可执行文件, 并使用main.cpp和arthmetic.cpp
add_executable(TestJoke main.cpp src/calc/arthmetic.cpp src/asm/stupid.asm)# 将include/calc包含进头文件目录内
target_include_directories(TestJoke PRIVATE "${CMAKE_SOURCE_DIR}/include/calc")# 生成的目标放到install/bin目录下
install(TARGETS TestJoke DESTINATION bin)# 执行命令TestJoke, 依赖是TestJoke生成, 也就是说TestJoke生成后立马执行TestJoke
add_custom_command(TARGET TestJokeCOMMAND TestJoke DEPENDS TestJoke 
)

再次运行构建脚本后发现这个错误, 这是studid.asm出的错, 因为汇编代码无法使用SafeSEH特性, 这里给关掉
在这里插入图片描述
在CMakeLists.txt中加入链接选项以此来关闭SafeSEH:在这里插入图片描述
再次运行build.bat后发现如下错误:
在这里插入图片描述
由于masm32 sdk开发包中是含有自己的编译器和链接器的。而当我使用VS编写cmake项目的时候使用的是VS自带的编译器和链接器, 这里是VS自带的编译器版本可以看到是14.x
而masm32 SDK开发套件的编译器版本是6.x
在这里插入图片描述
不同的编译器对汇编语法可能有细微的不同, 对语法的严格程度也不一样, 为了能适应VS自带版本编译器, 这里我选择修改masm32 sdk的头文件:
首先找到windows.inc并定位到出错行:
在这里插入图片描述
这里我选择将其改成宏, 这样可以规避这个问题:
在这里插入图片描述
代码如下:

COMP_ELEM_ALL MACROLOCAL temptemp = (COMP_ELEM_TYPE+COMP_ELEM_CHECKED+COMP_ELEM_DIRTY+COMP_ELEM_NOSCROLL)temp = temp + (COMP_ELEM_POS_LEFT+COMP_ELEM_SIZE_WIDTH+COMP_ELEM_SIZE_HEIGHT)temp = temp + (COMP_ELEM_POS_ZINDEX+COMP_ELEM_SOURCE+COMP_ELEM_FRIENDLYNAME)EXITM <temp>
ENDM

接着定位到winextra.inc, 并定位到出错的位置:
在这里插入图片描述
将方括号改成圆括号即可:
在这里插入图片描述
完成之后发现成功了:
在这里插入图片描述

3. 总结与注意点

  • 要非常注意名称粉碎的问题, 函数在C++编译后的名称, 与C编译后的名称是完全不同的, 为了确保能够找到对应的名称, 如果你要使用C++特性必须加上extern "C"让C++函数以C的名称粉碎的方式进行
  • 汇编语言和C的名称粉碎结果是一样的, 但是调用约定会影响名称粉碎的结果。默认情况下C/C++都用的是C调用约定, 所以你的汇编代码也要用C调用约定, 这也是为啥我用的是.model flat, C了

(完)

http://www.yayakq.cn/news/988734/

相关文章:

  • 做网站的用处免费推客推广平台
  • 网站建设 经典书籍注册传媒公司流程和费用
  • 廊坊网站建设咨询青橙网络建设互联网站是什么
  • 长春优惠做网站西安企业招聘
  • 创建网站要找谁农业门户网站建设目标
  • 网站开发的晋升晋升空间路径北京网站制作设计与开发服务
  • 福建省建设资格注册中心网站网页模板图片
  • 怎么做自己的网站后台教程西安网站建设gj
  • 杭州seo网站推广国外网站模板网站建设
  • 房屋租赁网站开发模版重庆工厂网站建设
  • 网上鲜花店网站建设实施方案商城手机网站开发
  • 视频直播网站网站跳出率 查询
  • 建成区违法建设治理网站商城网站建设公司地址
  • 关于建设旅游网站的书籍265上网导航
  • 企业网站如何做网警备案网站推广的目的是什
  • 网站开发服务合同范本百度怎么做网页
  • 下载建设网站软件长沙今天最新招聘信息
  • 做网站的人会不会拿走我的网站官方网站建设与维护好处
  • 南阳网站怎么推广单位网站建设建议对策
  • 专业网站设计制作费用自己有网站做点什么
  • 在线手机动画网站模板下载安装平台网站建设ppt模板下载
  • 西充企业网站建设局门户网站建设的目标
  • 实体行业做分销网站有什么好处微信网站html5
  • 西安做网站的公司在哪燕窝网站怎么做
  • 如何用腾讯云建设自己网站wordpress手机登陆不了
  • 社交类网站手机模版做百度推广需要有自己的网站吗
  • 学做网站初入门教程网站建设意味着什么
  • 全国网站建设公司排名律师网站模版
  • 温州做网站价格网站开发常用形状
  • 桂林做网站的公司有哪些wordpress情侣家园