【c/c++】c和cpp混合编译

c和cpp混合编译

#ifdef __cplusplus
extern "C" {
#endifextern int test(int, int);#ifdef __cplusplus
}
#endif

在这段代码中,#ifdef __cplusplus 和 #endif 之间的代码是为了在 C++ 中使用 C 语言的函数声明和定义时,确保编译器正确地处理 C 和 C++ 之间的语法差异。这是因为 C 和 C++ 有一些不同之处,包括函数名的重载、类型转换等。

在这段代码中,extern “C” 是一个 C++ 的特性,它告诉编译器要按照 C 的方式来处理其中的函数。具体来说:

#ifdef __cplusplus:这个条件编译指令检查是否正在编译 C++ 代码。__cplusplus 是一个宏,当编译器编译 C++ 代码时,它会被定义。因此,如果代码正在编译为 C++,那么这个条件成立。

extern “C” {:如果正在编译为 C++,那么 extern “C” 会告诉编译器,接下来的代码块中的函数应该以 C 的方式进行链接,而不是 C++ 的方式。这是因为在 C++ 中,函数名可以发生函数重载(同一个函数名可以有不同的参数列表),而在 C 中没有这个概念。因此,通过将函数声明包裹在 extern “C” 中,可以确保它们以 C 的方式进行链接,这样cpp代码可以与纯 C 代码一起使用而不会出现问题。

#endif:这是条件编译的结束指令,它用来结束 #ifdef __cplusplus 开始的条件编译块。如果不是在编译 C++ 代码,这个块中的代码会被忽略。

总之,这段代码的作用是确保在 C++ 中使用 C 语言函数时,编译器不会将其与 C++ 的语法特性混淆,从而确保代码的正确性。这在涉及到与 C 代码互操作的情况下非常有用,因为 C++ 和 C 之间存在一些重要的差异。

C++编译的时候会改函数的名字

C++ 在编译时会对函数的名字进行改编,这个过程被称为名称修饰(Name Mangling)。这是因为 C++ 允许函数重载,也就是说,可以定义多个同名函数,只要它们的参数列表不同。为了区分这些重载函数,C++ 编译器会对函数名进行修饰,将参数信息包含在函数名中,从而创建唯一的函数标识符。

举例来说,如果有以下两个函数:

int add(int a, int b);
double add(double a, double b);

在编译时,C++ 编译器会对这两个函数的名称进行改编,以便区分它们。名称修饰的结果可能会变成类似于 _Z3addii 和 _Z3adddd 这样的标识符,具体的修饰规则取决于编译器和平台。

然而,C 语言不支持函数重载,因此在 C 中不需要进行名称修饰。函数的名称在 C 中保持原样。这就是为什么在 C++ 中与 C 代码进行交互时需要使用 extern “C” 声明来告诉编译器不要对函数名称进行修饰,以便正确链接到 C 代码。

所以,为了确保 C++ 代码与 C 代码正确地进行交互,需要使用 extern “C” 声明,以防止 C++ 编译器对函数名称进行修饰,从而保持与 C 代码的兼容性。这样可以确保 C++ 代码能够与不进行名称修饰的 C 函数正确匹配。

从汇编的角度详细解释

名称修饰(Name Mangling)是一个高级语言(如C++)到汇编语言层面的概念,它涉及到函数和类的名称在汇编代码中的表示方式。不同编译器和平台可能会有不同的名称修饰规则,下面我将通过一个简单的例子来说明这个概念。

首先,让我们看一个简单的C++代码(extern “C”):

#include <iostream>
extern "C"
{
int add(int a, int b) {return a + b;
}
}
int main() {int result = add(3, 4);std::cout << result << std::endl;return 0;
}

接下来,我们将使用 g++ 编译这段代码,并通过汇编工具查看生成的汇编代码。可以使用以下命令来编译代码并生成汇编文件:

g++ -S -o example.s example.cpp

上述命令中,-S 选项告诉 g++ 生成汇编代码,并将其输出到 example.s 文件中。现在,让我们查看生成的 example.s 文件:

	.file	"example.cpp".text.local	_ZStL8__ioinit.comm	_ZStL8__ioinit,1,1.globl	add.type	add, @function
add:
.LFB1731:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movl	%edi, -4(%rbp)movl	%esi, -8(%rbp)movl	-4(%rbp), %edxmovl	-8(%rbp), %eaxaddl	%edx, %eaxpopq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1731:.size	add, .-add.globl	main.type	main, @function
main:
.LFB1732:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$16, %rspmovl	$4, %esimovl	$3, %edicall	addmovl	%eax, -4(%rbp)movl	-4(%rbp), %eaxmovl	%eax, %esileaq	_ZSt4cout(%rip), %raxmovq	%rax, %rdicall	_ZNSolsEi@PLTmovq	_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq	%rdx, %rsimovq	%rax, %rdicall	_ZNSolsEPFRSoS_E@PLTmovl	$0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1732:.size	main, .-main.type	_Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB2232:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$16, %rspmovl	%edi, -4(%rbp)movl	%esi, -8(%rbp)cmpl	$1, -4(%rbp)jne	.L7cmpl	$65535, -8(%rbp)jne	.L7leaq	_ZStL8__ioinit(%rip), %raxmovq	%rax, %rdicall	_ZNSt8ios_base4InitC1Ev@PLTleaq	__dso_handle(%rip), %raxmovq	%rax, %rdxleaq	_ZStL8__ioinit(%rip), %raxmovq	%rax, %rsimovq	_ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %raxmovq	%rax, %rdicall	__cxa_atexit@PLT
.L7:nopleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2232:.size	_Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii.type	_GLOBAL__sub_I_add, @function
_GLOBAL__sub_I_add:
.LFB2233:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movl	$65535, %esimovl	$1, %edicall	_Z41__static_initialization_and_destruction_0iipopq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2233:.size	_GLOBAL__sub_I_add, .-_GLOBAL__sub_I_add.section	.init_array,"aw".align 8.quad	_GLOBAL__sub_I_add.hidden	__dso_handle.ident	"GCC: (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0".section	.note.GNU-stack,"",@progbits.section	.note.gnu.property,"a".align 8.long	1f - 0f.long	4f - 1f.long	5
0:.string	"GNU"
1:.align 8.long	0xc0000002.long	3f - 2f
2:.long	0x3
3:.align 8
4:

在上述汇编代码中,我们关注的是 add函数和 main 函数。注意以下几点:

  1. .globl add表示 add 函数是全局可见的,这是因为我们在 main 函数中调用了它。

  2. .type add, @function 表示 add 函数是一个函数。

  3. .size add, .-add 给出了 add 函数的大小。

  4. add: 标识了 add 函数的入口点。

  5. call add是在 main 函数中调用 add 函数的指令。

从这个例子中,可以看到函数 add 在汇编代码中的名称没有发生明显的变化,因为这是一个普通的 C 函数。名称修饰通常在涉及到函数重载、命名空间、类等高级语言特性时变得更加复杂。不同的编译器和平台可能会使用不同的规则来进行名称修饰,所以具体的名称修饰方式会有所不同。

下面是不使用extern "C"的汇编代码:

#include <iostream>int add(int a, int b) {return a + b;
}int main() {int result = add(3, 4);std::cout << result << std::endl;return 0;
}

再次使用以下命令来编译代码并生成汇编文件:

g++ -S -o example.s example.cpp

查看生成的 example.s 文件:

	.file	"example.cpp".text.local	_ZStL8__ioinit.comm	_ZStL8__ioinit,1,1.globl	_Z3addii.type	_Z3addii, @function
_Z3addii:
.LFB1731:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movl	%edi, -4(%rbp)movl	%esi, -8(%rbp)movl	-4(%rbp), %edxmovl	-8(%rbp), %eaxaddl	%edx, %eaxpopq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1731:.size	_Z3addii, .-_Z3addii.globl	main.type	main, @function
main:
.LFB1732:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$16, %rspmovl	$4, %esimovl	$3, %edicall	_Z3addiimovl	%eax, -4(%rbp)movl	-4(%rbp), %eaxmovl	%eax, %esileaq	_ZSt4cout(%rip), %raxmovq	%rax, %rdicall	_ZNSolsEi@PLTmovq	_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq	%rdx, %rsimovq	%rax, %rdicall	_ZNSolsEPFRSoS_E@PLTmovl	$0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1732:.size	main, .-main.type	_Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB2232:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$16, %rspmovl	%edi, -4(%rbp)movl	%esi, -8(%rbp)cmpl	$1, -4(%rbp)jne	.L7cmpl	$65535, -8(%rbp)jne	.L7leaq	_ZStL8__ioinit(%rip), %raxmovq	%rax, %rdicall	_ZNSt8ios_base4InitC1Ev@PLTleaq	__dso_handle(%rip), %raxmovq	%rax, %rdxleaq	_ZStL8__ioinit(%rip), %raxmovq	%rax, %rsimovq	_ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %raxmovq	%rax, %rdicall	__cxa_atexit@PLT
.L7:nopleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2232:.size	_Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii.type	_GLOBAL__sub_I__Z3addii, @function
_GLOBAL__sub_I__Z3addii:
.LFB2233:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movl	$65535, %esimovl	$1, %edicall	_Z41__static_initialization_and_destruction_0iipopq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2233:.size	_GLOBAL__sub_I__Z3addii, .-_GLOBAL__sub_I__Z3addii.section	.init_array,"aw".align 8.quad	_GLOBAL__sub_I__Z3addii.hidden	__dso_handle.ident	"GCC: (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0".section	.note.GNU-stack,"",@progbits.section	.note.gnu.property,"a".align 8.long	1f - 0f.long	4f - 1f.long	5
0:.string	"GNU"
1:.align 8.long	0xc0000002.long	3f - 2f
2:.long	0x3
3:.align 8
4:

要查看真正的名称修饰效果,可以尝试创建一个包含类和函数重载的更复杂的 C++ 示例,并查看生成的汇编代码,以了解不同情况下的名称修饰规则。但需要注意的是,名称修饰通常是编译器的内部实现细节,不同编译器可能会有不同的名称修饰方案。

下面是一个包含类和函数重载的较复杂的 C++ 示例:

#include <iostream>class Math {
public:int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}
};int main() {Math math;int intResult = math.add(3, 4);double doubleResult = math.add(2.5, 3.7);std::cout << "Integer result: " << intResult << std::endl;std::cout << "Double result: " << doubleResult << std::endl;return 0;
}

在这个示例中,我们定义了一个名为 Math 的类,其中包含了两个 add 函数,一个用于整数相加,另一个用于浮点数相加。这两个函数具有相同的名称,但参数类型不同,这就是函数重载。

接下来,我们编译这个示例并查看生成的汇编代码。使用以下命令来生成汇编文件:

g++ -S -o complex_example.s complex_example.cpp

现在,让我们查看生成的 complex_example.s 文件中与 Math 类和 add 函数相关的部分:

   .file	"complex_example.cpp".text.local	_ZStL8__ioinit.comm	_ZStL8__ioinit,1,1.section	.text._ZN4Math3addEii,"axG",@progbits,_ZN4Math3addEii,comdat.align 2.weak	_ZN4Math3addEii.type	_ZN4Math3addEii, @function
_ZN4Math3addEii:
.LFB1731:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movq	%rdi, -8(%rbp)movl	%esi, -12(%rbp)movl	%edx, -16(%rbp)movl	-12(%rbp), %edxmovl	-16(%rbp), %eaxaddl	%edx, %eaxpopq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1731:.size	_ZN4Math3addEii, .-_ZN4Math3addEii.section	.text._ZN4Math3addEdd,"axG",@progbits,_ZN4Math3addEdd,comdat.align 2.weak	_ZN4Math3addEdd.type	_ZN4Math3addEdd, @function
_ZN4Math3addEdd:
.LFB1732:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movq	%rdi, -8(%rbp)movsd	%xmm0, -16(%rbp)movsd	%xmm1, -24(%rbp)movsd	-16(%rbp), %xmm0addsd	-24(%rbp), %xmm0movq	%xmm0, %raxmovq	%rax, %xmm0popq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1732:.size	_ZN4Math3addEdd, .-_ZN4Math3addEdd.section	.rodata
.LC2:.string	"Integer result: "
.LC3:.string	"Double result: ".text.globl	main.type	main, @function
main:
.LFB1733:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$32, %rspmovq	%fs:40, %raxmovq	%rax, -8(%rbp)xorl	%eax, %eaxleaq	-21(%rbp), %raxmovl	$4, %edxmovl	$3, %esimovq	%rax, %rdicall	_ZN4Math3addEiimovl	%eax, -20(%rbp)movsd	.LC0(%rip), %xmm0movq	.LC1(%rip), %rdxleaq	-21(%rbp), %raxmovapd	%xmm0, %xmm1movq	%rdx, %xmm0movq	%rax, %rdicall	_ZN4Math3addEddmovq	%xmm0, %raxmovq	%rax, -16(%rbp)leaq	.LC2(%rip), %raxmovq	%rax, %rsileaq	_ZSt4cout(%rip), %raxmovq	%rax, %rdicall	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@PLTmovq	%rax, %rdxmovl	-20(%rbp), %eaxmovl	%eax, %esimovq	%rdx, %rdicall	_ZNSolsEi@PLTmovq	_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq	%rdx, %rsimovq	%rax, %rdicall	_ZNSolsEPFRSoS_E@PLTleaq	.LC3(%rip), %raxmovq	%rax, %rsileaq	_ZSt4cout(%rip), %raxmovq	%rax, %rdicall	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@PLTmovq	%rax, %rdxmovq	-16(%rbp), %raxmovq	%rax, %xmm0movq	%rdx, %rdicall	_ZNSolsEd@PLTmovq	_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq	%rdx, %rsimovq	%rax, %rdicall	_ZNSolsEPFRSoS_E@PLTmovl	$0, %eaxmovq	-8(%rbp), %rdxsubq	%fs:40, %rdxje	.L7call	__stack_chk_fail@PLT
.L7:leave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1733:.size	main, .-main.type	_Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB2237:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$16, %rspmovl	%edi, -4(%rbp)movl	%esi, -8(%rbp)cmpl	$1, -4(%rbp)jne	.L10cmpl	$65535, -8(%rbp)jne	.L10leaq	_ZStL8__ioinit(%rip), %raxmovq	%rax, %rdicall	_ZNSt8ios_base4InitC1Ev@PLTleaq	__dso_handle(%rip), %raxmovq	%rax, %rdxleaq	_ZStL8__ioinit(%rip), %raxmovq	%rax, %rsimovq	_ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %raxmovq	%rax, %rdicall	__cxa_atexit@PLT
.L10:nopleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2237:.size	_Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii.type	_GLOBAL__sub_I_main, @function
_GLOBAL__sub_I_main:
.LFB2238:.cfi_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movl	$65535, %esimovl	$1, %edicall	_Z41__static_initialization_and_destruction_0iipopq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2238:.size	_GLOBAL__sub_I_main, .-_GLOBAL__sub_I_main.section	.init_array,"aw".align 8.quad	_GLOBAL__sub_I_main.section	.rodata.align 8
.LC0:.long	-1717986918.long	1074633113.align 8
.LC1:.long	0.long	1074003968.hidden	__dso_handle.ident	"GCC: (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0".section	.note.GNU-stack,"",@progbits.section	.note.gnu.property,"a".align 8.long	1f - 0f.long	4f - 1f.long	5
0:.string	"GNU"
1:.align 8.long	0xc0000002.long	3f - 2f
2:.long	0x3
3:.align 8
4:

在这个汇编代码中,可以看到两个 add 函数的名称发生了变化,它们被命名为 _ZN4Math3addEii 和 _ZN4Math3addEdd。这些名称修饰是由编译器根据函数的参数类型生成的,以确保在汇编级别可以区分这两个重载函数。

这个示例演示了名称修饰在涉及到函数重载的情况下的应用,以确保正确的函数被调用。在实际应用中,名称修饰对于支持函数重载、运算符重载以及类的成员函数等高级语言特性非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫基础之正则表达式

目录 一、什么是正则表达式&#xff1f; 二、re.compile()编译函数 三、group()获取匹配结果函数 四、常用匹配规则 4.1匹配单个字符 4.2匹配前字符次数 4.3匹配原生字符串 4.4匹配字符串开头和结尾 4.5分组匹配 五、re.match()开头匹配函数 六、re.search()全文搜索…

JavaScript Web APIs -03 事件流、事件委托、其他事件(加载、滚动、尺寸)

Web APIs - 03 文章目录 Web APIs - 03事件流捕获和冒泡阻止冒泡 事件委托其他事件页面加载事件元素滚动事件页面尺寸事件 元素尺寸与位置 进一步学习 事件进阶&#xff0c;实现更多交互的网页特效&#xff0c;结合事件流的特征优化事件执行的效率 掌握阻止事件冒泡的方法理解事…

【MySQL系列】索引的学习及理解

「前言」文章内容大致是MySQL索引的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、索引概念二、从硬件角度理解2.1 磁盘2.2 结论 三、从软件角度理解四、共识五、索引的理解5.1 一个现象和结论5.2 对Page进行建模5.3 索引可以采用的数据结构5.…

opencv-人脸识别

对https://blog.csdn.net/weixin_46291251/article/details/117996591这哥们代码的一些修改 import cv2 import numpy as np import os import shutil import threading import tkinter as tk from PIL import Image, ImageTkchoice 0# 首先读取config文件&#xff0c;第一行…

多线程(额外扩展)(面试会用)

1 线程状态 1.1 状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢&#xff1f;Java中的线程 状态被定义在了java.lang.Thread.State枚…

使用飞桨实现的第一个AI项目——波士顿的房价预测

part1.首先引入相应的函数库: 值得说明的地方&#xff1a; &#xff08;1&#xff09;首先&#xff0c;numpy是一个python库&#xff0c;主要用于提供线性代数中的矩阵或者多维数组的运算函数&#xff0c;利用import numpy as np引入numpy&#xff0c;并将np作为它的别名 part…

基于OFDM的水下图像传输通信系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 function [rx_img] func_TR(tx_img, num_path, pathdelays, pathgains, snr) rng(default); …

热血江湖C#

目录 1 热血江湖 1.1 GClass4 1.1.1 method_10 1.1.2 加载公告出错----没有公告数据 1.1.3 加载检查物品出错----没有检查物品数据 热血江湖 GClass4public void method_1()

iOS UITableView上拉加载解决偶然跳动的Bug

最近做项目,测试测出来一个Bug,列表添加了上拉刷新和下拉加载,当我弹窗消失时,调用刷新列表后,在某个手机型号上,偶发列表刷新跳动的bug。(一般在列表上拉加载刷新到最后一页后,再弹窗消失,reload列表,会出现此bug) Bug复现如下:RPReplay_Final1693296737 解决方案…

ubuntu上安装boost库为SOMEIP的X86和ARM下编译做准备(编译两种版本)

1 X86架构Linux(ubuntu)操作系统上Boost库的编译安装1.1 Boost源码下载1.2 编译选项配置1.3 编译 Boost 库1.4安装 Boost 库2 Boost库的ARM架构编译1 X86架构Linux(ubuntu)操作系统上Boost库的编译安装 Boost库是C++拓展库,是SOMEIP源码编译所必需的库。编译 Boost 库时,…

无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件

VUE报错如下 无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件。“e:/visualstudio_code/emppre/node_modules/element-plus/dist/locale/zh-cn.mjs”隐式拥有 “any” 类型。 如果“element-plus”包实际公开了此模块&#xff0c;请尝试添加包含 declare modul…

【C++】set和map

set和map 1. 预备知识2. set2.1 set的概念2.2 set的常见接口 3. multiset4. map4.1 map的概念4.2 map的常见接口 5. multimap6. 练习 1. 预备知识 set和map是关联式容器&#xff0c;里面存储的不是元素本身&#xff0c;存储的是<key,value>结构的键值对&#xff0c;比ve…

go 、rust、python 语言 编码效率、性能比较

1、 Rust适合内存使用苛刻、无GC、超高性能的场景&#xff0c; 如果是实时计算系统&#xff0c;那rust的吞吐量对于Go还是有一定优势的&#xff0c;基于线程和goroutine的调度模式还是有差别的。能用他的都是高手&#xff0c;代码量大&#xff0c;内存占用不高&#xff0c; 20…

日本橙皮书数据库—《医疗用医药品质量情报集》

日本橙皮书是一份关于医疗用医药品质量情报的汇总报告&#xff0c;由日本厚生劳动省发布。它主要涵盖了药品的品质再评价信息&#xff0c;特别是针对特定历史阶段的产品&#xff0c;笔者总结信息如下&#xff1a; ①日本橙皮书数据库包含了一系列药品的详细信息&#xff0c;如…

43、基于 springboot 自动配置的 spring mvc 错误处理,就是演示项目报错后,跳转到自定义的错误页面

Spring MVC 的错误处理&#xff1a;基于 SpringBoot 自动配置之后的 Spring MVC 错误处理。 就是访问方法时出错&#xff0c;然后弄个自定义的错误页面进行显示。 ★ 两种错误处理方式 方式一&#xff1a; 基于Spring Boot自动配置的错误处理方式&#xff0c;只要通过属性文件…

原生js实现轮播图及无缝滚动

我这里主要说轮播图和无缝滚动的实现思路&#xff0c;就采用最简单的轮播图了&#xff0c;当然实现的思路有很多种&#xff0c;我这也只是其中一种。 简单轮播图的大概结构是这样的&#xff0c;中间是图片&#xff0c;二边是箭头可以用来切换图片&#xff0c;下面的小圆点也可以…

Unity3d C#实现调取网络时间限制程序的体验时长的功能

前言 如题的需求应该经常在开发被提到&#xff0c;例如给客户体验3–5天的程序&#xff0c;到期后使其不可使用&#xff0c;或者几年的使用期限。这个功能常常需要使用到usb加密狗来限制&#xff0c;当然这也的话就需要一定的硬件投入。很多临时提供的版本基本是要求软件来实现…

代理模式 静态代理和动态代理(jdk、cglib)——Java入职第十一天

一、代理模式 一个类代表另一个类去完成扩展功能,在主体类的基础上,新增一个代理类,扩展主体类功能,不影响主体,完成额外功能。比如买车票,可以去代理点买,不用去火车站,主要包括静态代理和动态代理两种模式。 代理类中包含了主体类 二、静态代理 无法根据业务扩展,…

在ubuntu上安装ns2和nam(ubuntu16.04)

在ubuntu上安装ns2和nam 版本选择安装ns2安装nam 版本选择 首先&#xff0c;版本的合理选择可以让我们避免很多麻烦 经过测试&#xff0c;ubuntu的版本选择为ubuntu16.04&#xff0c;ns2的版本选择为ns-2.35&#xff0c;nam包含于ns2 资源链接(百度网盘) 链接:https://pan.bai…

explain各个字段代表的意思

id&#xff1a;联表查询是每个表的读取顺序&#xff0c;数字越大越先被读取。相同就需要通过table字段判断select_type&#xff1a;查询类型或者是其他操作类型&#xff08;PRIMARY、UNION、UNION RESULT等&#xff09;table&#xff1a;正在访问哪个表partitions&#xff1a;匹…