Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++ 语言】 C 与 C++ 兼容 ( extern "C" )

【C++ 语言】 C 与 C++ 兼容 ( extern "C" )

作者头像
韩曙亮
发布于 2023-03-27 08:47:04
发布于 2023-03-27 08:47:04
3K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

创建项目

创建 并运行 CMake 项目 :

  • 1. 选择创建选项 : 在打开的欢迎界面中 , 点击 右侧最下方的 "创建新项目 " 选项 ;
  • 2. 选择项目类型 : 选择创建 “CMake 项目” , 在 Android 中主要使用的也是 CMake 配置 NDK C/C++ 代码 ;
  • 3. 项目配置 : 输入项目名称 , 选择项目位置 , 下面的解决方案名称会自动生成 , 不勾选最下方的选项 ; 点击 “创建” 按钮 , 创建项目 ;

等待项目创建完毕 , 会自动跳转到程序主界面 ;

  • 4. 自动生成解决方案 : 进入程序主界面后 , 系统会自动生成 CMake 解决方案 , 如果一切顺利 , 会有如下结果 :

5. 选择启动项 : 点击绿色的小三角按钮 “选择启动项” , 选择上面生成的解决方案 “001_CMake_1.exe” 选项 , 如下图示 ;

  • 6. 运行程序 : 再次点击 “001_CMake_1.exe” 选项 , 即可运行该控制台程序 , 在控制台中打印 “Hello CMake。” ;

项目源码说明

相关源码说明 :

① 001_CMake_1.h : 项目头文件 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 001_CMake_1.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>

// TODO: 在此处引用程序需要的其他标头。

② 001_CMake_1.cpp : 项目主代码文件 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 001_CMake_1.cpp: 定义应用程序的入口点。
//

#include "001_CMake_1.h"

using namespace std;

int main()
{
	cout << "Hello CMake。" << endl;
	return 0;
}

C 与 C++ 标准输出 :

  • C 中的标准输出 : 直接调用 printf
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printf("Hello");
  • C++ 中的标准输出 : << 此处是 操作符重载 , coutstd 命名空间中 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cout << "Hello" << endl; 

③ CMakeLists.txt ( 工程目录下 ) : 项目构建配置文件 , 配置 构建工具版本号 , 项目编译所需的源代码 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# CMakeList.txt: 001_CMake_1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

# 将源代码添加到此项目的可执行文件。
add_executable (001_CMake_1 "001_CMake_1.cpp" "001_CMake_1.h")

# TODO: 如有需要,请添加测试并安装目标。

④ CMakeLists.txt ( 总目录下 ) : 顶层的 CMake 文件, 配置全局所有子项目信息 , 这里只有一个子项目 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)

project ("001_CMake_1")

# 包含子项目。
add_subdirectory ("001_CMake_1")

C++ 中直接调用 C 代码 ( 无法解析的外部符号 错误 )

C++ 向下兼容 : C 中大部分代码都可以在 C++ 中直接使用 ; 但是需要做兼容处理 , 不能直接使用 ;

1. 创建测试文件 : 在上述创建的项目中 , 创建 c_extern.c 和 c_extern.h 两个文件 ;

2. c_extern.h 头文件内容 : 在头文件中定义一个带参数的方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma once

//任意定义一个方法 , 该方法有若干个参数和返回值
int add(int a, int b);

3. c_extern.c 源文件内容 : 在 C 语言文件中实现上述头文件中定义的带参数的方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "c_extern.h"

//实现的头文件中的方法, 用于测试 C 与 C++ 兼容问题
int add(int a, int b)
{
	return 0;
}

4. CMake 配置源码 : 将 “c_extern.c” ( C文件 ) 和 “c_extern.h” ( 头文件 ) 配置到 CMakeLists.txt 中 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# CMakeList.txt: 001_CMake_1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

# 将源代码添加到此项目的可执行文件。
add_executable (001_CMake_1 "001_CMake_1.cpp" "001_CMake_1.h" "c_extern.c" "c_extern.h")

# TODO: 如有需要,请添加测试并安装目标。

5. 执行结果 : 点击 001_CMake_1.exe 选项 , 运行程序 ; 弹出 “生成失败 , 是否要继续调试?” 的对话框 , 此时

6. 错误提示 : 无法解析在 main 函数中调用的 add 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
严重性	代码	说明	项目	文件	行	禁止显示状态
错误	LNK1120	1 个无法解析的外部命令	...\CMakeLists.txt	...\001_CMake_1.exe	1	
错误	LNK2019	无法解析的外部符号 "int __cdecl add(int,int)" (?add@@YAHHH@Z),
该符号在函数 main 中被引用	
...\CMakeLists.txt	...\001_CMake_1.cpp.obj	1	

在 C++ 源码中直接调用 C 源码 , 一定会报该错误 , 下面分析产生该错误的原因 , 以及如何进行兼容处理 ;


C++ 与 C 编译结果对比

1. 创建对比文件 : 创建 下面 两个文件 , 分别是 C 代码 和 C++ 代码 ;

① c_code.c :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int add (int a, int b){
	return a+b;
}

int main(){
	return 0;
}

② c_plus_code.cpp :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int add (int a, int b){
	return a+b;
}

int main(){
	return 0;
}

C 和 C++ 中代码内容一模一样 ;

2. 获取 c_code.c 编译过程中的 机器码文件 : 使用 gcc c_code.c -o c_code.o 命令 , 可以获取编译的中间文件 , 输出到 c_code.o 文件中 ;

3. 获取 C语言文件编译后的 机器码文件中对应的符号 : 使用 nm -A c_code.o 命令 , 可以查看 c_code.o 二进制文件中的符号 ;

输出详细内容 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@ubuntu:~/001_c_c++# gcc c_code.c -o c_code.o
root@ubuntu:~/001_c_c++# 
root@ubuntu:~/001_c_c++# ls
c_code.c  c_code.o  c_plus_code.cpp
root@ubuntu:~/001_c_c++# 
root@ubuntu:~/001_c_c++# nm -A c_code.o
c_code.o:00000000004004d6 T add
c_code.o:0000000000601030 B __bss_start
c_code.o:0000000000601030 b completed.7594
c_code.o:0000000000601020 D __data_start
c_code.o:0000000000601020 W data_start
c_code.o:0000000000400410 t deregister_tm_clones
c_code.o:0000000000400490 t __do_global_dtors_aux
c_code.o:0000000000600e18 t __do_global_dtors_aux_fini_array_entry
c_code.o:0000000000601028 D __dso_handle
c_code.o:0000000000600e28 d _DYNAMIC
c_code.o:0000000000601030 D _edata
c_code.o:0000000000601038 B _end
c_code.o:0000000000400574 T _fini
c_code.o:00000000004004b0 t frame_dummy
c_code.o:0000000000600e10 t __frame_dummy_init_array_entry
c_code.o:00000000004006d0 r __FRAME_END__
c_code.o:0000000000601000 d _GLOBAL_OFFSET_TABLE_
c_code.o:                 w __gmon_start__
c_code.o:0000000000400584 r __GNU_EH_FRAME_HDR
c_code.o:0000000000400390 T _init
c_code.o:0000000000600e18 t __init_array_end
c_code.o:0000000000600e10 t __init_array_start
c_code.o:0000000000400580 R _IO_stdin_used
c_code.o:                 w _ITM_deregisterTMCloneTable
c_code.o:                 w _ITM_registerTMCloneTable
c_code.o:0000000000600e20 d __JCR_END__
c_code.o:0000000000600e20 d __JCR_LIST__
c_code.o:                 w _Jv_RegisterClasses
c_code.o:0000000000400570 T __libc_csu_fini
c_code.o:0000000000400500 T __libc_csu_init
c_code.o:                 U __libc_start_main@@GLIBC_2.2.5
c_code.o:00000000004004ea T main
c_code.o:0000000000400450 t register_tm_clones
c_code.o:00000000004003e0 T _start
c_code.o:0000000000601030 D __TMC_END__
root@ubuntu:~/001_c_c++# 

4. 分析上述输出内容 : 由 第一行 c_code.o:00000000004004d6 T add 可以看出 , add 方法编译后的符号为 add ;

5. 获取 c_plus_code.cpp 编译过程中的 机器码文件 : 使用 gcc c_plus_code.cpp -o c_plus_code.o 命令 , 可以获取编译的中间文件 , 输出到 c_plus_code.o 文件中 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@ubuntu:~/001_c_c++# gcc c_plus_code.cpp -o c_plus_code.o
root@ubuntu:~/001_c_c++# ls
c_code.c  c_code.o  c_plus_code.cpp  c_plus_code.o
root@ubuntu:~/001_c_c++# 
root@ubuntu:~/001_c_c++# nm -A c_plus_code.o
c_plus_code.o:0000000000601030 B __bss_start
c_plus_code.o:0000000000601030 b completed.7594
c_plus_code.o:0000000000601020 D __data_start
c_plus_code.o:0000000000601020 W data_start
c_plus_code.o:0000000000400410 t deregister_tm_clones
c_plus_code.o:0000000000400490 t __do_global_dtors_aux
c_plus_code.o:0000000000600e18 t __do_global_dtors_aux_fini_array_entry
c_plus_code.o:0000000000601028 D __dso_handle
c_plus_code.o:0000000000600e28 d _DYNAMIC
c_plus_code.o:0000000000601030 D _edata
c_plus_code.o:0000000000601038 B _end
c_plus_code.o:0000000000400574 T _fini
c_plus_code.o:00000000004004b0 t frame_dummy
c_plus_code.o:0000000000600e10 t __frame_dummy_init_array_entry
c_plus_code.o:00000000004006d0 r __FRAME_END__
c_plus_code.o:0000000000601000 d _GLOBAL_OFFSET_TABLE_
c_plus_code.o:                 w __gmon_start__
c_plus_code.o:0000000000400584 r __GNU_EH_FRAME_HDR
c_plus_code.o:0000000000400390 T _init
c_plus_code.o:0000000000600e18 t __init_array_end
c_plus_code.o:0000000000600e10 t __init_array_start
c_plus_code.o:0000000000400580 R _IO_stdin_used
c_plus_code.o:                 w _ITM_deregisterTMCloneTable
c_plus_code.o:                 w _ITM_registerTMCloneTable
c_plus_code.o:0000000000600e20 d __JCR_END__
c_plus_code.o:0000000000600e20 d __JCR_LIST__
c_plus_code.o:                 w _Jv_RegisterClasses
c_plus_code.o:0000000000400570 T __libc_csu_fini
c_plus_code.o:0000000000400500 T __libc_csu_init
c_plus_code.o:                 U __libc_start_main@@GLIBC_2.2.5
c_plus_code.o:00000000004004ea T main
c_plus_code.o:0000000000400450 t register_tm_clones
c_plus_code.o:00000000004003e0 T _start
c_plus_code.o:0000000000601030 D __TMC_END__
c_plus_code.o:00000000004004d6 T _Z3addii
root@ubuntu:~/001_c_c++# 

6. 分析上述输出内容 : 由 最后一行 c_plus_code.o:00000000004004d6 T _Z3addii 可以看出 , add 方法编译后的符号为 _Z3addii ;

处理完毕后的文件内容 :

7. 总结 :

  • ① 编译结果对比 : C 语言 add 方法编译后的符号是 add , C++ 编译后的符号是 _Z3addii , 显然二者不能互相调用 , 因此一旦在 C++ 中调用 add , 就会出现上述无法解析外部符号错误 ;
  • ② 兼容 : 如果在 C++ 文件中调用 C 语言库 , 需要做兼容处理 ;
  • ③ 示例 : 在 Android 中的 NDK 接口是 C++ 语言的 , 但是调用的库 如 OpenSL ES , FFMPEG 等都是 C语言的库 , 因此这里就需要用到 C 与 C++ 的兼容 ;
  • ④ 兼容方法 : 使用 extern “C”{} 指定让大括号中的内容 以 C 语言的方式进行编译 ; 这样才能在 C++ 中找到对应的 C 语言中的函数 ; 如下示例 :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extern "C"{
	#include "c_extern.c"
}

编译过程 : 预处理 -> 编译 -> 汇编 -> 链接; 1. 编译预处理 : 产生 .i 后缀的预处理文件; 2. 编译操作 : 产生 .s 后缀的汇编文件; 3. 汇编操作 : 产生 .o 后缀的机器码二进制文件; 4. 链接操作 : 产生可执行文件 ;


extern “C” 在头文件中的标准用法

extern “C” 用法 :

  • 1. 在引用处使用 : extern “C” {} 可以写在 引用 头文件的位置 , 如下 :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 001_CMake_1.cpp: 定义应用程序的入口点。
//

#include "001_CMake_1.h"

extern "C" {
	#include "c_extern.h"
}

using namespace std;

int main()
{
	cout << "Hello CMake。" << endl;

	//调用 c_extern.h 头文件中定义的方法
	//该方法定义在了 C 语言文件中
	add(1, 2);

	return 0;
}
  • 2. 在头文件中定义 : extern “C” {} 也可以写在 头文件 中 , 一般情况下我们编写的 C 代码需要同时兼容 C 和 C++ , 因此 C 语言的头文件都进行如下定义 :
    • ① __cplusplus 宏 : 该宏定义在 C++ 编译器中 , 如果是 C 语言编译器 , 就不会定义该宏 ;
    • ② 使用效果 : 如果在 C++ 编译环境中 , extern “C” { 和 } 生效 , 在 C 语言编译环境中 , 不生效 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma once

//兼容 C 与 C ++ 语言 , 在 C++ 中也可以编译 C 语言程序
// __cplusplus 是编译器中定义的 宏 

//如果编译的是 C++ 代码 , 定义了__cplusplus 宏 ,  #ifdef __cplusplus 宏会生效

//这一组判定 extern "C" { 声明 , 是否生效 , 如果在 C++ 环境中生效 , C 语言环境中不生效
#ifdef __cplusplus
extern "C" {
#endif

	//任意定义一个方法 , 该方法有若干个参数和返回值
	int add(int a, int b);

//这一组判定 } 声明 , 是否生效 , 如果在 C++ 环境中生效 , C 语言环境中不生效
#ifdef __cplusplus
}
#endif

注意上述兼容二选一 , 不能同时使用 , 否则会报错 ;


最终的 C / C ++ 兼容 代码

最终的 C / C ++ 兼容 代码 :

  • 1.程序结构 :
  • 2.顶层 CMakeLists.txt : 配置多个项目 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)

project ("001_CMake_1")

# 包含子项目。
add_subdirectory ("001_CMake_1")
  • 3.项目 CMakeLists.txt : 配置单个项目中的多个源文件 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# CMakeList.txt: 001_CMake_1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

# 将源代码添加到此项目的可执行文件。
add_executable (001_CMake_1 "001_CMake_1.cpp" "001_CMake_1.h" "c_extern.c" "c_extern.h")

# TODO: 如有需要,请添加测试并安装目标。
  • 4.c_extern.h :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma once

//兼容 C 与 C ++ 语言 , 在 C++ 中也可以编译 C 语言程序
// __cplusplus 是编译器中定义的 宏 

//如果编译的是 C++ 代码 , 定义了__cplusplus 宏 ,  #ifdef __cplusplus 宏会生效

//这一组判定 extern "C" { 声明 , 是否生效 , 如果在 C++ 环境中生效 , C 语言环境中不生效
#ifdef __cplusplus
extern "C" {
#endif

	//任意定义一个方法 , 该方法有若干个参数和返回值
	int add(int a, int b);

//这一组判定 } 声明 , 是否生效 , 如果在 C++ 环境中生效 , C 语言环境中不生效
#ifdef __cplusplus
}
#endif
  • 5.c_extern.c :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "c_extern.h"

//实现的头文件中的方法, 用于测试 C 与 C++ 兼容问题
int add(int a, int b)
{
	return 0;
}
  • 7.001_CMake_1.h :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 001_CMake_1.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>

// TODO: 在此处引用程序需要的其他标头。
  • 8.001_CMake_1.cpp :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 001_CMake_1.cpp: 定义应用程序的入口点。
//

#include "001_CMake_1.h"
#include "c_extern.h"

using namespace std;

int main()
{
	cout << "Hello CMake。" << endl;

	//调用 c_extern.h 头文件中定义的方法
	//该方法定义在了 C 语言文件中
	add(1, 2);

	return 0;
}
  • 9.运行结果 :
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
今天介绍一下Android Studio 2.2 下 NDK开发 ,那叫一个顺溜—-纵享丝滑! 虽然现在AS 2.2 之后,jni开发配置相当方便,但是还是建议大家从我的第一篇文章看起,从基础知识入手,并且要了解之前是如何配置NDK工程的,这是一个循序渐进的过程。
先知先觉
2019/01/21
7010
ROS学习——第1讲 ROS概述及环境搭建
好事文章地址:https://cloud.tencent.com/developer/article/2469534
Arya
2024/11/22
6860
ROS学习——第1讲 ROS概述及环境搭建
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMake的全称是Cross-platform Make。我第一次参与Linux C++开发时使用的工具是Make,而后开始切换到CMake,一开始以为CMake是和C语言有关,原来开头的C表示它可以跨平台。
Coder-ZZ
2023/02/23
3.1K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
Android JNI学习(二)——实战JNI之“hello world”
首先在Android Studio创建一个Android项目,包名为gebilaolitou.ndkdemo
隔壁老李头
2018/08/30
3.1K0
Android JNI学习(二)——实战JNI之“hello world”
NDK 开发环境配置
它可以根据不同平台、不同的编译器,并通过CMakeLists.txt文件中简单的语句来描述所有平台的编译过程,生成相应的Makefile文件或project文件。CMake被引入于AndroidStudio2.2,其目的是替代原有的JNI/DNK开发方法,使AS在进行JNI/NDK时更加的方便、高效。
Yif
2019/12/26
2K0
编译工具 Ninja 介绍
在Unix/Linux下通常使用Makefile来控制代码的编译,但是Makefile对于比较大的项目有时候会比较慢,看看上面那副漫画,代码在编译都变成了程序员放松的借口了。所以这个Google的程序员在开发Chrome的时候因为忍受不了Makefile的速度,自己重新开发出来一套新的控制编译的工具叫作Ninja,Ninja相对于Makefile这套工具更注重于编译速度。除了Chrome现在还有一些其他的比较大的项目也在开始使用Ninja,比如LLVM。我试用了一下感觉还是不错,比如编译Cmake时间大概是原来的1/4。Ninja试用C++实现,其支持的语法非常简单,作者在这里说明了为了控制复杂度。
一个会写诗的程序员
2021/06/21
14.7K1
【C/C++ 2】Clion配置与运行C语言
【C/C++ 1】Clion配置与运行C语言 【C/C++ 2】Clion配置与运行C语言
学到老
2020/05/28
1.6K0
Linux 下用 Clion 编写及调用共享库的实践
https://zetaoyang.github.io/post/2016/11/05/linux-shared-object.html
bear_fish
2018/09/19
6.6K0
cmake快速入门「建议收藏」
cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其官方网站是www.cmake.org,可以通过访问官方网站来获得更多关于cmake的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。
全栈程序员站长
2022/09/13
1.3K0
cmake快速入门「建议收藏」
【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
类定义 , 类一般定义在一个单独的文件中 , C++ 的文件名不像 Java 一样必须与类名相同 , C++ 中的文件名可以与类名不相等 , 一般情况下尽量让类名与文件名一致 ;
韩曙亮
2023/03/27
7420
【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
CMake学习笔记
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了—–CMake!
CtrlX
2023/02/06
2.2K0
Android 编译C++
  在开发过程中,有一些底层库,算法、加解密之类的功能,不是用Java写的,而是C或者C++,而我们需要在Android工程中调用C/C++的函数达到理想的要求,那么这个时候你就需要知道怎么使用它们。
晨曦_LLW
2022/11/23
1.8K0
Android 编译C++
【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )
② 主要作用 : 主要作用是配置本工程中的 C/C++ 源码如何编译成动态库的 ;
韩曙亮
2023/03/27
3.3K0
Android NDK开发基础
NDK即Native Development Kit,是Android上用来开发c/c++的开发工具包。 安装步骤:developer.android.com/studio/proj…
没关系再继续努力
2021/12/03
2.1K0
Cpp(九) gRPC protobuf for C++ 基本使用
Mac: https://github.com/Coxhuang/FKCpp/tree/master/gRPCDemo/macOS
Autooooooo
2021/02/02
5.9K0
面向 C++ 的现代 CMake 教程(三)
你可能会认为,在我们成功将源代码编译成二进制文件之后,作为构建工程师我们的工作就完成了。事实几乎如此——二进制文件包含了 CPU 执行的所有代码,但代码分散在多个文件中,方式非常复杂。链接是一个简化事物并使机器代码整洁、易于消费的过程。
ApacheCN_飞龙
2024/05/26
9610
面向 C++ 的现代 CMake 教程(三)
【Android面试速学】JNI 了解一下?
Android 系统中有大量的实现都是native实现的,中间通过JNI进行java层调用。学会JNI的使用,不光是能为我们开发和面试提供助力,还能为我们理解android 系统源码的基础多加两块砖。 说明一下这篇文章的内容和目的:
用户6256742
2024/05/17
1720
【Android面试速学】JNI 了解一下?
详细剖析 extern "C"
这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~”。
C语言与CPP编程
2021/01/25
1.5K0
ubuntu/win10 CLion 使用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details/77803333
bear_fish
2018/09/19
1.8K0
ubuntu/win10 CLion 使用
重新编译运行C++/Cuda混编项目
由于需要,最近得重新运行一个CUDA项目,但我苦于没有经验,只能从编译开始入门一下,不过还是不算难的,难的是原项目代码不保证质量,而且有若干无关文件,且运行环境未知、各模块的运行版本也不是很清楚,导致搞了一大堆操作(应该是正确的)最后却没跑起来,是的,这是一篇翻车笔记。
ZONGLYN
2020/03/02
1.7K0
重新编译运行C++/Cuda混编项目
相关推荐
Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验