`

extern C 与c/c++动态库编写

阅读更多
extern c 是c++ 兼容c语言接口的一种方式,关键在于c++支持函数重载,同名的函数参数不通话编译后会产生不同的函数符号,而c语言则没有这个特性
在c++中使用extern "C", 就相当于以C的接口方式导出, 而C是不支持函数重载的;
这样编译的动态库不仅可以给c++程序调用还可以给其他任何语言区调用

去掉 extern"C"之后连也可以编译生成动态库,当c++程序调用这个库的时候没有问题, 但linux下别的语言比如java程序调用这个动态库的函数时, 报: "找不到函数定义"
linux下
test.h
#ifndef TEST_H
#define TEST_H
#ifdef __cplusplus
extern "C"
{
#endif
int add (int a,int b);
#ifdef __cplusplus
}
#endif
#endif


test.cpp

#include "test.h"
int add(int a,int b)
{

return a+b;
}


g++ -fPIC -shared test.cpp -olibtest.so

这种方式编译的动态库可以通过其他语言的程序调用

test.h
#ifndef TEST_H
#define TEST_H

int add (int a,int b);

#endif


test.cpp

#include "test.h"
int add(int a,int b)
{

return a+b;
}


g++ -fPIC -shared test.cpp -olibtest.so


这种方式编译的接口只能通过c++来调用,java调用的时候会提示add函数找不到

分享到:
评论

相关推荐

    Demo: c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL

    3. **C++动态库调用C动态库**:由于C语言的ABI(应用程序二进制接口)兼容性,C++代码可以直接调用C语言编写的DLL。只需确保C++函数声明遵循C语言的命名约定(通常是extern "C"),并且C语言的DLL导出函数不使用C++...

    C语言调C++共享库

    本示例将介绍如何使用CMake构建一个C++动态库,并允许C语言程序调用该库中的函数。以下是实现这一目标的关键知识点: 1. **C++动态库**:动态库(Dynamic Link Library或Shared Object)是一种在运行时被加载到进程...

    C#调用C++动态库,执行回调函数并传递结构体参数

    首先,C#调用C++动态库是通过P/Invoke实现的,这是一种.NET Framework提供的特性,允许托管代码(如C#)调用非托管代码(如C++)。为了进行调用,我们需要在C#中定义与C++接口一致的委托类型和结构体类型,以匹配C++...

    C写的DLL给C/C++和VB调用

    本文将详细介绍如何使用C语言编写动态链接库(DLL),并将其用于C/C++和VB语言的调用。我们将从头开始,介绍DLL的基本概念、C语言编写DLL的步骤、C/C++和VB语言中的调用方法,并提供相应的代码示例。 一、DLL的基本...

    C#winform调用C++库案例,使用C++编写动态库,然后再用C#调用当前C++编写的动态库

    创建C++动态库的过程如下: 1. **创建C++项目**:在Visual Studio中,选择"新建项目",然后选择"C++ Win32"类别下的"Win32控制台应用程序"。在向导中,选择"动态库(DLL)"作为项目类型,并确保"空项目"选项被选中。 ...

    Python调用C/C++动态链接库的方法详解

    Python调用C/C++动态链接库(DLL)是跨语言编程中常见的技术,它允许Python程序利用C或C++编写的高效代码。本篇将详细解释如何实现这一过程。 首先,我们需要了解C/C++动态链接库。DLL(Dynamic Link Library)是一种...

    vs2010 C/C++ 调用汇编dll

    本篇将详细讲解如何在Visual Studio 2010 (VS2010)环境下,创建汇编语言编写的动态链接库(DLL),并从C/C++程序中调用这些函数。这个过程分为几个关键步骤,包括编写汇编代码、创建DLL项目、设置头文件和接口,以及...

    java调用C/C++全过程

    3. **编写C/C++实现**: 根据生成的头文件编写具体的本地代码实现。 ```c #include "TestDll.h" int i = 0; JNIEXPORT jint JNICALL Java_TestDll_get(JNIEnv *, jclass) { return i; } JNIEXPORT void ...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    本案例将详细介绍如何使用JNA来调用C++动态库,特别是处理二维数组的输入和输出。 首先,我们需要了解JNA的基本原理。JNA通过映射Java接口到本地函数,实现了跨语言调用。它提供了一个简洁的方式来定义C/C++函数...

    C#调用C++动态库实例程序,地址映射传参,

    C++动态库允许我们编写低级别的代码,这在处理系统级任务或优化性能时非常有用。C#作为.NET框架的一部分,提供了丰富的类库和简洁的语法,使得开发用户界面和应用程序逻辑变得简单。 接下来,`地址映射传参`是指C#...

    C语言调用C++类中的方法

    有时,我们可能需要在C语言项目中调用C++编写的类和方法,这种情况在跨语言交互或维护既有C代码库时尤为常见。本教程将详细讲解如何实现这一目标。 首先,为了使C语言能够调用C++的方法,我们需要确保C++类具备...

    JNI技术手册 c/c++调用java

    - 生成动态库。 - 运行程序。 - **调用中考虑的问题:** - 数据类型转换。 - 字符串处理。 - 数组处理。 - **对JAVA传入数据的处理:** - 字节数组处理。 #### 八、C/C++调用JAVA类 - **加载虚拟机:** - ...

    C++创建调用静态动态库

    创建C++动态库的步骤如下: 1. 同样,编写源代码,如`libfunc.cpp`。 2. 编译生成目标文件:`g++ -c -fpic libfunc.cpp`,这里添加`-fpic`选项是为了生成位置无关码,适合动态库。 3. 创建未链接的动态库:`g++ -...

    ip网络地址查询(c/c++)混编示例

    在C/C++中,我们可以通过`dlopen()`, `dlsym()`等函数来加载和使用动态库。这允许程序在运行时加载特定的功能,而不是在编译时就硬编码进去。 而"ip_geo_using_a"可能意味着使用静态链接库(.a文件,Linux下的静态...

    Android调用C/C++(NDK)

    - 在`jni`目录下编写C/C++代码,通常会有一个对应的`JNI`头文件,由`javah`工具自动生成,定义了Java和C/C++之间的接口。 - 使用`extern "C"`来避免C++名字修饰,确保Java能正确识别函数。 6. **构建与运行** - ...

    C#调用C++DLL动态库.rar_C#调用C++DLL动态库_c++dll动态库_c++开发动态库

    本主题关注的是如何在C#环境下调用由C++编写的DLL动态链接库,实现两者之间的交互。以下将详细解释这个过程的关键知识点。 1. **C#与C++互操作性**: C#(C Sharp)是.NET Framework的一部分,它是一种面向对象的...

    C/C++中兴程序员面试

    加上`extern "C"`可以告诉C++编译器按照C语言的方式来处理符号,避免命名冲突。 5. **两种for循环的优缺点**: - 第一个循环: - 优点:逻辑清晰,易于理解。 - 缺点:每次都需要检查条件,稍微多一些执行时间。 ...

    c#调用C++动态库

    本教程将深入讲解如何在C#应用程序中调用C++动态库,以实现两者之间的有效协同。 首先,我们来看C++动态库的创建过程。C++代码通常会定义一些函数或者类,这些元素会被导出到动态库中供其他程序使用。在C++中,导出...

Global site tag (gtag.js) - Google Analytics