在linux和windows用c++編寫c接口的動態庫

linux

動態的頭文件api.hlinux

#ifndef _API_H
#define _API_H

#ifdef DLL_IMPLEMENT
#define DLL_EXPORT extern "C"
#else
#define DLL_EXPORT
#endif

DLL_EXPORT int mysum(int a, int b);

#endif // _API_H

動態庫的源文件api.cppios

#define DLL_IMPLEMENT

#include "api.h"
#include <iostream>

DLL_EXPORT int mysum(int a, int b)
{
    std::cout << "This (mysum) is a c++ function." << std::endl;
    return a + b;
}

調用動態庫的測試代碼main.cc++

#include <stdio.h>
#include "api.h"

int main()
{
    int sum = mysum(8, 3);
    printf("The sum is %d\n", sum);
}

下面在命令行測試:windows

g++ -shared -fPIC -o libmyapi.so api.cpp    #生成動態庫
gcc main.c -o a.out -L. -lmyapi    #連接動態庫生成執行文件
ln -s /path/to/libmyapi.so /usr/lib/libmyapi.so    #在系統的動態庫搜索路徑創建軟鏈接
ldconfig    #讓系統從新搜索一遍動態庫
./a.out    #執行,下面是輸出
This (mysum) is a c++ function.
The sum is 11

windows

動態的頭文件api.hapi

#ifndef _API_H
#define _API_H

#ifdef DLL_IMPLEMENT
#define DLL_EXPORT extern "C" __declspec(dllexport)
#else
#define DLL_EXPORT extern "C" __declspec(dllimport)
#endif

#define MYAPI __stdcall

DLL_EXPORT int MYAPI mysum(int a, int b);

#endif // _API_H

動態庫的源文件api.cpp測試

#define DLL_IMPLEMENT

#include "api.h"
#include <iostream>int MYAPI mysum(int a, int b)
{
    std::cout << "This (mysum) is a c++ function." << std::endl;
    return a + b;
}

調用動態庫的測試代碼main.cspa

#include <stdio.h>
#include "api.h"
#pragma comment(lib, "./myapi.lib")

int main()
{
    int sum = mysum(8, 3);
    printf("The sum is %d\n", sum);
}

windows在visual studio中測試便可命令行

 

overcode

相關文章
相關標籤/搜索