首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C或C++中获取/链接外部函数?

在C或C++中获取/链接外部函数,通常需要使用动态链接库(Dynamic Link Library,简称DLL)或共享库(Shared Library,简称SO)。以下是一个简单的示例,展示了如何在C++中使用动态链接库。

  1. 创建动态链接库的源代码文件(例如:my_dll.cpp):
代码语言:cpp
复制
#include<iostream>

// 导出函数
#ifdef _WIN32
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

extern "C" {
    EXPORT int my_function(int a, int b) {
        return a + b;
    }
}
  1. 编译动态链接库:

在Windows上,使用以下命令编译动态链接库:

代码语言:bash
复制
g++ -shared -o my_dll.dll my_dll.cpp

在Linux上,使用以下命令编译动态链接库:

代码语言:bash
复制
g++ -shared -o libmy_dll.so my_dll.cpp
  1. 创建一个使用动态链接库的应用程序(例如:main.cpp):
代码语言:cpp
复制
#include<iostream>
#include<windows.h> // 在Windows上使用动态链接库
// 或者
// #include <dlfcn.h>  // 在Linux上使用动态链接库

typedef int (*MyFunction)(int, int);

int main() {
    // 加载动态链接库
    #ifdef _WIN32
    HINSTANCE hDLL = LoadLibrary("my_dll.dll");
    #else
    void* hDLL = dlopen("libmy_dll.so", RTLD_LAZY);
    #endif

    if (hDLL == NULL) {
        std::cerr << "Failed to load DLL"<< std::endl;
        return 1;
    }

    // 获取外部函数的指针
    #ifdef _WIN32
    MyFunction my_function = (MyFunction)GetProcAddress(hDLL, "my_function");
    #else
    MyFunction my_function = (MyFunction)dlsym(hDLL, "my_function");
    #endif

    if (my_function == NULL) {
        std::cerr << "Failed to get function pointer"<< std::endl;
        return 1;
    }

    // 调用外部函数
    int result = my_function(3, 4);
    std::cout << "Result: "<< result<< std::endl;

    // 卸载动态链接库
    #ifdef _WIN32
    FreeLibrary(hDLL);
    #else
    dlclose(hDLL);
    #endif

    return 0;
}
  1. 编译并运行应用程序:

在Windows上,使用以下命令编译应用程序:

代码语言:bash
复制
g++ main.cpp -o main.exe

在Linux上,使用以下命令编译应用程序:

代码语言:bash
复制
g++ main.cpp -o main

运行应用程序,将会输出结果:

代码语言:txt
复制
Result: 7

这个示例展示了如何在C++中使用动态链接库获取外部函数。在实际应用中,可能需要根据具体需求进行调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • CMake 秘籍(五)

    每个项目都必须处理依赖关系,而 CMake 使得在配置项目的系统上查找这些依赖关系变得相对容易。第三章,检测外部库和程序,展示了如何在系统上找到已安装的依赖项,并且到目前为止我们一直使用相同的模式。然而,如果依赖关系未得到满足,我们最多只能导致配置失败并告知用户失败的原因。但是,使用 CMake,我们可以组织项目,以便在系统上找不到依赖项时自动获取和构建它们。本章将介绍和分析ExternalProject.cmake和FetchContent.cmake标准模块以及它们在超级构建模式中的使用。前者允许我们在构建时间获取项目的依赖项,并且长期以来一直是 CMake 的一部分。后者模块是在 CMake 3.11 版本中添加的,允许我们在配置时间获取依赖项。通过超级构建模式,我们可以有效地利用 CMake 作为高级包管理器:在您的项目中,您将以相同的方式处理依赖项,无论它们是否已经在系统上可用,或者它们是否需要从头开始构建。接下来的五个示例将引导您了解该模式,并展示如何使用它来获取和构建几乎任何依赖项。

    02

    C++:无法解析的外部符号问题 与 头文件包含注意要点

    由于种种原因,很长时间没有完整地编写一个C++程序。近期编写的程序都是简单地算法实现程序和简略的模拟程序,对于C++的许多特性都变得模糊不清。为了完成暑假的操作系统大作业——文件系统的模拟实现,从0开始写一个完成的程序。开始都进行得十分顺利,但编写完主要的头文件与cpp文件后,准备开始测试函数,进行Debug时,VS却提示大量错误信息,其中大都是:无法解析的外部符号。几天(暑假时间,不是没天都有大量时间认真编程,见笑了)时间过去后,尝试了多种解决方法终于找到了问题所在。于是有了写下搜寻过程的想法,要是有人能看这篇文章快速解决自己的问题,那就更好了。 结论:真正引起的错误的原因在于头文件的包含是否得当!

    02
    领券