CMake进行C/C++与汇编混合编程

这篇具有很好参考价值的文章主要介绍了CMake进行C/C++与汇编混合编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前提


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

2. 配置

创建一个cmake工程
CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
VS是支持多个工程在一个解决方案中的, 目前使用的是单工程。这是我习惯的目录树:CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
解释一下其中含义:

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

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

首先看一下目录树:CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
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 TestJoke
	COMMAND 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脚本就可以发现执行成功了
CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
执行成功后, 可执行文件被安装到了install/bin/目录下, 构建文件在out/build/目录下生成
CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
下面将进行汇编语言的配置, 首先去masm32下载对应的sdk: 下载masm32 sdk

添加汇编代码后的目录树:
CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
stupid.asm内容:

.586
.model flat, C
option casemap:none

include 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 SBYTE
	push MB_OK
	push pszCap
	push pszMsg 
	push NULL
	call MessageBox
	ret 
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 TestJoke
	COMMAND TestJoke 
	DEPENDS TestJoke 
)

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

COMP_ELEM_ALL MACRO
    LOCAL temp
    temp = (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, 并定位到出错的位置:
CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
将方括号改成圆括号即可:
CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编
完成之后发现成功了:
CMake进行C/C++与汇编混合编程,杂七杂八,c语言,c++,汇编

3. 总结与注意点

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

(完)文章来源地址https://www.toymoban.com/news/detail-833362.html

到了这里,关于CMake进行C/C++与汇编混合编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rpc入门笔记 0x02 protobuf的杂七杂八

    安装grpcio和grpcio-tools库 生成proto的python文件 python -m grpc_tools.protoc :使用grpc_tools包中的protoc命令进行代码生成。 --python_out=. :指定生成的Python代码的存放位置为当前目录。 --grpc_python_out=. :指定生成的gRPC代码的存放位置为当前目录。 -I. :指定搜索.proto文件的路径为当前目录

    2024年02月08日
    浏览(58)
  • CMake进行C/C++与汇编混合编程

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

    2024年02月21日
    浏览(22)
  • 利用cmake和模板编程进行字节序转换

    想利用模板编程进行编译期计算,想先判断主机字节序然后利用std::enable_if(C++17使用if constexpr)根据字节序是大端还是小端来判断是否进行字节序转换。但第一步编译期判断字节序不成功,因为union类型不能constexpr, 起对成员的选择访问是运行时的;而又不想运行时判断,所

    2024年02月04日
    浏览(33)
  • 用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

    ARM 编程模拟器网站地址: 在arm里也有和高级语言一样的for和while循环,可以根据条件来判断是否执行 首先我们创建一个data标签,然后在里面写一个分支,存放一些数值,然后使这些存放的数值依次相加 然后我们要将list加载到内存里 然后使用直接寻址,将r0寄存器里的值放

    2024年02月06日
    浏览(49)
  • Keil MDK配置ARM汇编/C语言混合开发环境

    1. 安装Keil MDK 安装方法这里不再说明,懂得都懂!🐶 2. 安装ARM开发包 在Keil MDK5之后,不再原生支持ARM7/9,需要自行安装软件包,链接在这,注意安装与自己MDK版本对应的那个包 我的版本是5.18,下载之后傻瓜式安装,因为它会自动检测你MDK所在的位置。 3. 新建工程 注意:选

    2024年02月02日
    浏览(57)
  • qt&python混合编程

    参考:Qt调用Python详细过程_贝勒里恩的博客-CSDN博客_qt python 1.环境搭建 1.1.python3.6 32bits 1.2.qt5.12.12 32bits 说明: (1). 务必保持版本位数一致,没有一致就得重新下载一致的版本 (2).以上软件环境的下载和安装,请自行百度,资料很多,在此重点说说混合编程遇到的错误如何解决. (3).请装

    2024年02月06日
    浏览(55)
  • qt matlab 混合编程

    matlab 2021a qt 5.12.10 qt creator 4.13.1 opencv 4.3.0 eigen-3.4.0/eigen-3.4.0 以 aberr_analy1 的导出 dill 举例 命令行中输入:deploytool 2. 选择LIbrarycompiler 3type 选择c++ 4,选择相应的 5. 点击package  选择保存的路径即可 6.导出后: 只需要 下面这个文件里面的dll .h 和。Lib 文件 1.opencv +eigen-3.4.0+matlab

    2024年02月07日
    浏览(43)
  • 使用高斯混合模型进行聚类

            高斯混合模型 (GMM) 是一种基于概率密度估计的聚类分析技术。它假设数据点是由具有不同均值和方差的多个高斯分布的混合生成的。它可以在某些结果中提供有效的聚类结果。         K 均值聚类算法在每个聚类的中心周围放置一个圆形边界。当数据具有圆

    2024年02月09日
    浏览(35)
  • C++和QML混合编程

    Qt元对象系统中注册C++类,在QML中实例化、访问。 C++中实例化并设置为QML上下文属性,在QML中直接使用。            比较: 方法1 可以使C++类在QML中作为一个数据类型,例如函数参数类型或属性类型,也可以使用其枚举类型、单例等,功能更强大。 派生自QObject类或QObject类

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包