zoukankan      html  css  js  c++  java
  • How to Use the Dynamic Link Library in C++ Linux (C++调用Delphi写的.so文件)

    The Dynamic Link Library (DLL) is stored separately from the target application and shared among different applications, compared to Static Library. The DLL is the file extension on Windows while on Linux, it is *.so (Shared Object).

    The *.so/*.dll can be loaded right before the application starts or during the application’s runtime. On Windows, the Win32 API LoadLibrary is used while on Linux gcc compiler, the dlopen function is used.

    CREATING *.SO ON WINDOWS

    There are many ways and many languages to create a *.so on Linux e.g. You can write a C or C++ source code and compile it with the following command:

    1
    
    gcc -shared -o libhello.so -fPIC hello.c

    Example hello.c that exports the hello function:

    1
    2
    3
    
    int hello() {
        return 8; // my lucky number
    }

    Let’s do this slightly differently. In this post, we learn that you can now use Delphi to compile the source code into Linux 64-bit Server native code directly.. So, let’s do this by creating a tiny Delphi DLL/*.so library. This library exports a single function that takes a double and returns its double value.


    build-dll-using-delphi-for-linux-64-bit

    And, as you hit F9 to build, you will have the libProject6.so file, the Linux *.so library (if you change target platform to Windows, the code will be compiled into Project6.dll automatically, that is the beauty of the Delphi IDE).

    HOW TO USE THE DYNAMIC LINK LIBRARY IN C++ LINUX (GCC COMPILER)?

    Copy the file to Ubuntu and create the following C/C++ source code in the same directory.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    // https://helloacm.com/how-to-use-the-dynamic-link-library-in-c-linux-gcc-compiler/
    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
     
    // function export from the *.so
    typedef double (*double_ptr)(double);
     
    int main(int argc, char **argv) {
        char *error;
        double_ptr GetDouble;
        void *handle;
        // open the *.so
        handle = dlopen ("./libProject6.so", RTLD_LAZY);
        if (!handle) {
            fputs (dlerror(), stderr);
            exit(1);
        }
        // get the function address and make it ready for use
        GetDouble = (double_ptr)dlsym(handle, "GetDouble");
        if ((error = dlerror()) != NULL)  {
            fputs(error, stderr);
            exit(1);
        }
        // call the function in *.so
        printf ("%f
    ", (*GetDouble)(2.0));
        // remember to free the resource
        dlclose(handle);
    }

    The RTLD_LAZY resolves undefined symbols when code from the dynamic library is executed, which is faster to open. Alternatively, RTLD_NOW resolves all undefined symbols before dlopen returns and fails if this cannot be done.

    Compile the source code using (-ldl, the Interfaces for Dynamic Loader):

    1
    
    gcc -o test test.cpp -ldl

    Run the test which should print a nice:

    1
    2
    
    root@helloacm.com:/home/delphi# ./test
    4.000000

    –EOF (The Ultimate Computing & Technology Blog) —

    https://helloacm.com/how-to-use-the-dynamic-link-library-in-c-linux-gcc-compiler/
    https://helloacm.com/delphi-compiles-code-to-linux-64-bit-server/
    https://helloacm.com/quick-review-delphi-10-2-tokyo-preview/

  • 相关阅读:
    转--安装11g oracle
    数据可视化分析(柱状图、饼图、折线图、雷达图)
    2021双十一自动刷淘宝喵糖Auto.js脚本(安卓适用)
    最近升级了一下小老婆(8核 2x8G DDR3 128G SSD)
    [Orchard CMS系列] 创建主题(Writing a new theme)
    百度,你家云管家能靠谱点不?替你脸红!Shame on you!
    [解决]ASP.NET MVC 4/5 源码调试(source code debug)
    [解决]Kali Linux DHCP自动获取IP失败 坑爹的VMWare桥接
    SSRS 页面默认显示英文
    3.2、OSPF
  • 原文地址:https://www.cnblogs.com/findumars/p/6371815.html
Copyright © 2011-2022 走看看