Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C代码调用C++函数

C代码调用C++函数

作者头像
十毛
发布于 2019-03-27 07:37:36
发布于 2019-03-27 07:37:36
2.3K00
代码可运行
举报
运行总次数:0
代码可运行

本实例是最简化的实现模板,一个头文件hello.h及其C++实现hello.cpp,另外就是C代码main.c,来调用hello.cpp实现的函数.

hello.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef H_HELLO
#define H_HELLO
#ifdef __cplusplus
extern "C" {
#endif
int getAge();
int getCount();
#ifdef __cplusplus
}
#endif
#endif

hello.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include "hello.h"
int getAge() {
    std::cout << "get age" << std::endl;
    return 99;
}
int getCount() {
    std::cout << "get count" << std::endl;
    return 123456;
}

编译为动态链接库 g++ -fPIC -shared -o libhello.so hello.cpp

main.c

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

int main() {
    int age = getAge();
    int count = getCount();
    printf("%d:%d\n", age, count);
    return 0;
}

gcc main.c -L. -lhello -o main

makefile自动化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main: main.c libhello.so
    gcc main.c -L. -lhello -o main
libhello.so: hello.cpp
    g++ -fPIC -shared -o libhello.so hello.cpp
clean:
    rm -f *.o *.so main

至此,已经实现了C代码调用C++自定义库函数

验证混合调用

main.cpp

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

int main() {
    int age = getAge();
    std::cout << age << ":" << getCount() << std::endl;
    return 0;
}

g++ main.cpp -L. -lhello -o main

可以看出,C++、C代码可以共享函数getAge(), getCount()

注意事项

  • __cplusplus前面是两个下划线

如果对你有一点帮助,麻烦为我点一个赞,如果没有帮助,也非常期待你的反馈

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一个简单例子教会你C++动态库的用法
在 Linux 下使用 C++ 创建和使用动态库(通常是 .so 文件,即 Shared Object)包含几个关键步骤:创建动态库、编译、链接,以及在应用程序中使用这个库。下面是一个简要的指南:
DBA札记
2023/12/04
9160
一个简单例子教会你C++动态库的用法
动态链接库
动态链接库,又称为共享链接库。采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件。这样带来的好处是可执行文件中记录的是功能模块的地址,真正的实现代码会在程序运行时被载入内存,这意味着,即便功能模块被调用多次,使用的都是同一份实现代码(这也是将动态链接库称为共享链接库的原因)。同样这也带来了缺陷,此方式生成的可执行文件无法独立运行,必须借助相应的库文件。
zy010101
2020/12/02
1.7K0
动态链接库
适合具备 C 语言基础的 C++ 入门教程(九)
在上一则教程中,叙述了关于C++类型转换的相关内容,在本节教程中,将叙述 C++的另一个内容,也就是抽象,这也是 C++相对于 C语言来说独特的一点,下面我们就来着重叙述这一点。
wenzid
2021/02/24
4240
适合具备 C 语言基础的 C++ 入门教程(九)
4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
可以看到输出结果,每个函数的入口地址都不一样(重载函数的入口地址,必须使用强制转换来获取)
诺谦
2019/05/24
8860
Linux编译工具:gcc入门
1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。 2. gcc的特点 gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。 gcc不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运
Tencent JCoder
2018/07/02
4.8K0
非标准c库函数->封装成库
编译:当有c语言源代码可以直接编译 换句话说就是.c和.h .cpp在同一层目录下 在ubuntu16.04运行
天天Lotay
2022/12/02
4090
非标准c库函数->封装成库
一、介绍
Sets properties on targets. The syntax for the command is to list all the targets you want to change, and then provide the values you want to set next. You can use any prop value pair you want and extract it later with the get_property() or get_target_property() command.
233333
2022/09/19
3120
C与C++混合编程
extern "C"是C++ 的特性,是一种链接约定,通过它可以实现兼容C与C++ 之间的相互调用,即对调用函数能够达成一致的意见. extern中的函数和变量都是extern类型的:可以在本模块或者其他模块中使用,被extern "C"修饰的 例子
iot-me.club
2022/02/11
4330
C++ 和 Makefile 笔记
比如工程目录下,将CPP文件放置在 src 目录下,H文件放在 header下,则makefile可以这样写
tonglei0429
2019/07/22
8620
C++ 和 Makefile 笔记
Linux下动态库(.so)和静态库(.a) 的区别
动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。
bear_fish
2018/09/20
17.5K0
CMake学习笔记
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了—–CMake!
CtrlX
2023/02/06
2.1K0
gcc用法以及静态/动态链接
-E:只进行预处理,不编译 -S:只编译,不汇编 -c:只编译、汇编,不链接 -g:编译器在编译的时候产生调试信息。 -I:指定include包含文件的搜索目录 -o:输出成指定文件名,如果缺省则输出位a.out -L:搜索库的路径 -l:指定程序要链接的库 -w:忽略所有警告 -shared:指定生成动态链接库。 -static:指定生成静态链接库。 -fPIC:表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码,概念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。
用户2929716
2018/08/23
1.6K0
gcc用法以及静态/动态链接
C++-入门语法(一)
C++ 的发展历史 语法须知 C++的源文件扩展名是:cpp(c plus plus的简称) C++程序的入口是main函数(函数即方法,一个意思) C++完全兼容C语言的语法,很久以前,C++叫做C
cwl_java
2019/10/26
4050
C语言中调用C++
因项目中需要更新VAD算法,VAD使用C++实现的. 代码框架中需要使用C调用C++来实现对VAD的调用. C++调用C很方便, 如果C调用C++,主要思想是将C++的动态库封装一层,这一层采用C语言实现,主要封装C++中的类 示例 test_class.h #ifndef TESTCLASS_H #define TESTCLASS_H #include<iostream> #include<stdio.h> class ValueClass { private: int value;
程序手艺人
2018/05/18
9.3K0
【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等
在说明Linux的.a、.so和.o文件关系之前,先来看看windows下obj,lib,dll,exe的关系。
自学气象人
2023/01/13
5.6K0
java调用c++函数的简单笔记
java使用jni调用c++动态库函数. 步骤: 1.编写java测试代码如下: 1 public class CallNativeDemo { 2 native void func(); 3 4 native double add(double a, double b); 5 6 public static void main(String[] args) { 7 System.loadLibrary("Main"); 8 Cal
Gxjun
2018/03/27
1.7K0
Linux 下用 Clion 编写及调用共享库的实践
https://zetaoyang.github.io/post/2016/11/05/linux-shared-object.html
bear_fish
2018/09/19
6.5K0
C++如何调用写好的C接口?
如何在C++代码中调用写好的C接口?你可能会奇怪,C++不是兼容C吗?直接调用不就可以了,那么我们来测试一下,先看看C++如何调用C代码接口的。
DeROy
2021/10/13
1.2K0
C++如何调用写好的C接口?
c++之重载函数学习总结
从上面报错的结果里面有一个单词ambiguous(意思是梦棱两可的),也就是说默认参数这种使用时不允许的。
用户6280468
2022/03/21
4130
C++调用C语言写成的动态链接库
C++在语法上是兼容C的,但是这不代表使用C语言不做任何处理直接写成的动态链接库就可以被C++给调用。由于C++引入了函数重载的机制,而这个机制的实现是在编译器层面的。编译器在“生成”函数符号信息时,不能仅仅通过函数名,因为重载函数的函数名都是一样的,所以它还要根据函数参数,命名空间等信息来确定唯一的函数签名;而C语言没有函数重载机制,C语言编译器在处理的时候通过函数名就可以唯一确定一个函数。这就导致C语言和C++语言生成的函数签名是不同的,故不能不做任何处理直接调用。下面我们来看一下C和C++编译同样一段代码为动态链接库以后的,它们的函数符号信息有什么不一样。
zy010101
2020/11/04
3.1K0
C++调用C语言写成的动态链接库
相关推荐
一个简单例子教会你C++动态库的用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验