精华内容
下载资源
问答
  • c++编译动态链接库dll

    2019-10-12 15:50:47
    c++编译程序为动态链接库dll文件,然后在新工程里调用 1、编写要编译的程序 函数部分add.cpp #include<iostream> #include "header.h" using namespace std;int add(int a,int b) { return a + b; } ...

    c++编译程序为动态链接库dll文件,然后在新工程里调用

    1、编写要编译的程序

    函数部分add.cpp

    #include<iostream>
    #include "header.h"
    using namespace std;int add(int a,int b)
    {
     return a + b;
    }
    

    头文件header.hpp

    #define USB_CAMERA_API _declspec(dllexport)
    #include<iostream>
    extern "C"
    {
     USB_CAMERA_API int add(int a, int b);
    }

    整个工程如下图所示
    在这里插入图片描述
    编译:点击项目属性选择配置属性为动态库(.dll),然后点击编译,在x64/release文件夹下生成makedll.dll和makedll.lib文件
    在这里插入图片描述
    在这里插入图片描述

    2、调用dll文件

    编写调用程序test.cpp,将生成的makedll.dll和makedll.lib文件复制到test.cpp所在目录

    #include <Windows.h> 
    #include <tchar.h>
    #include<stdio.h>
    #include<iostream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        HINSTANCE hInst = LoadLibrary(L"makedll.dll");
        if (!hInst)  
        {
    	  printf("加载MathFuns.dll失败!\n");  
        }
        typedef int(*DllDemoAPIProc)(int a, int b);
        DllDemoAPIProc add = (DllDemoAPIProc)::GetProcAddress(hInst,   "add");
        int result = add(3, 2);
        cout << result << endl;
        ::FreeLibrary(hInst);
        system("pause");
        return 0;
    }

    项目资源文件下添加makedll.lib
    在这里插入图片描述
    运行程序
    在这里插入图片描述

    展开全文
  • (4)编译动态链接库(dll) 在stdafx.h中包含以下头文件 #include #include #include 选择OpenCVTest.h头文件,删掉原有的函数,加上一些extern "C"等代码后如图,showImg函数为我们要测试opencv能否使用的函数。...

    1.OpenCV安装

    opencv 3.0.0.exe 下载地址 https://pan.baidu.com/s/1sk9yrAd

    下载完成后点开安装,安装后出现,里面有两个文件夹

    2.环境配置

    我的电脑→属性→高级系统设置→环境变量


    (1)用户变量→新建,

    变量名:OPENCV,

    变量值:F:\linjun_file\Learning\C#_file\opencv\build (我的opencv安装目录的build文件夹的位置)



    (2)系统变量

    找到变量名为Path的变量点击编辑,如果没有新建变量名为Path的变量


    如果已有变量值,需要在原有的变量值后面加上 ; 符号,如果没有可以直接添加上

    变量值:%OPENCV%\x86\vc12\bin;%OPENCV%\x64\vc12\bin(把x86和x64的都加上)

    点击确定,环境变量配置完成

    3.C++编译OPENCV动态链接(dll)

    (1)项目创建

    新建→项目→Visual C++→Win32→Win32项目,创建名为OpenCVTest的项目

    勾选下列选项,点击完成


    (2)平台配置(64位需要,32位跳过)

    创建好项目后,如果系统是,右键解决方案→属性→配置属性→配置


    下拉框选择Release,点击配置管理器,点击



    在配置管理器中设置如下,点击新建,选择x64



    点击确定。完成配置。


    (3)配置OpenCV相关库

    鼠标右键项目→属性右VC++目录



    包含目录点击编辑,加上以下文件夹目录,此目录为opencv安装目录build文件夹里面的include



    然后在库目录里面加上

    F:\linjun_file\Learning\C#_file\opencv\build\x64\vc12\lib

    F:\linjun_file\Learning\C#_file\opencv\build\x64\vc12\staticlib

    F:\linjun_file\Learning\C#_file\opencv\build\x86\vc12\lib

    F:\linjun_file\Learning\C#_file\opencv\build\x86\vc12\staticlib


    然后选择链接器→输入→附加依赖项,然后在空白处复制粘贴输入以下链接库


    链接库:

    opencv_ts300.lib
    opencv_world300.lib
    IlmImf.lib
    ippicvmt.lib
    libjasper.lib
    libjpeg.lib
    libpng.lib
    libtiff.lib
    libwebp.lib
    opencv_calib3d300.lib
    opencv_core300.lib
    opencv_features2d300.lib
    opencv_flann300.lib
    opencv_highgui300.lib
    opencv_imgcodecs300.lib
    opencv_imgproc300.lib
    opencv_ml300.lib
    opencv_objdetect300.lib
    opencv_photo300.lib
    opencv_shape300.lib
    opencv_stitching300.lib
    opencv_superres300.lib
    opencv_video300.lib
    opencv_videoio300.lib
    opencv_videostab300.lib

    zlib.lib

    点击应用,然后点击确定,库环境配置完成。


    (4)编译动态链接库(dll)


    在stdafx.h中包含以下头文件

    #include <opencv2\opencv.hpp>
    #include <opencv\cv.hpp>
    #include <opencv\highgui.h>

    选择OpenCVTest.h头文件,删掉原有的函数,加上一些extern "C"等代码后如图,showImg函数为我们要测试opencv能否使用的函数。


    代码:

    #ifdef OPENCVTEST_EXPORTS
    #define OPENCVTEST_API extern "C" __declspec(dllexport)
    #else
    #define OPENCVTEST_API extern "C" __declspec(dllimport)
    #endif
    
    OPENCVTEST_API int fnOpenCVTest(void);
    OPENCVTEST_API int showImg(char * image);

    OpenCVTest.cpp


    代码:

    #include "stdafx.h"
    #include "OpenCVTest.h"
    
    using namespace cv;
    
    // 这是导出函数的一个示例。
    OPENCVTEST_API int fnOpenCVTest(void)
    {
    	return 42;
    }
    
    OPENCVTEST_API int showImg(char* image){
    	Mat pic = imread(image);
    	if (pic.empty()){
    		return -1;
    	}
    	imshow("tu", pic);
    	return 0;
    }

    至此,工程编写完成,右键解决方案,重新生成解决方案。

    然后右键解决方案→在文件资源管理器中打开文件夹



    此为编译完成的动态链接库。将其取出放置桌面。


    (5)dll文件验证

    点击 开始找到,然后点进去

    弹出


    输入dumpbin -exports dll文件的目录,按



    红框为我们要记住的入口名字。待会C#调用时需要用到。


    4.C#调用自制的dll动态链接库

    (1)创建C#项目

    重新打开VS2013,新建→项目→C#项目→window窗体应用程序


    在窗口中创建一个按钮,添加点击事件


    (2)添加动态库(dll)

    执行方式选择Release


    右键项目→文件资源管理器打开项目文件夹,进入bin/Release目录

    将生成的dll文件复制进该目录


    (3)调用动态库

    进入form.cs,添加命名空间

    using System.Runtime.InteropServices;

    引入dll库

    [DllImport("OpenCVTest.dll", EntryPoint = "showImg")]
    extern static int showImg(String image);
    代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace CSharpOpenCV
    {
        public partial class Form1 : Form
        {
            [DllImport("OpenCVTest.dll", EntryPoint = "showImg")]
            extern static int showImg(String image);
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                showImg("C:\\Users\\Vander\\Desktop\\xxx.png");
    
            }
        }
    }

    代码编写完成。

    (4)调试程序

    重新生成解决方案,点击运行程序


    表示编译目标平台不合适,右键,项目→属性,取消勾选“首选32位”,目标平台选择“Any CPU”或者“x64”


    在点击运行出现


    无法加载模块,说明仍然缺少某些必须的dll库,找到opencv的安装目录,opencv\build\x64\vc12\bin,将opencv_world300.dll文件复制进C#项目的Release文件夹里面,跟OpenCVTest.dll同目录。



    重新生成解决方案,运行点击按钮。


    调用成功!


    展开全文
  • 最近小编由于需要,要在python项目中使用c++的一些类库,遇到一些问题与大家分享。 首先我在VS中新建空的c++项目,项目结构如下: 头文件test.h代码如下: #pragma once #ifndef TEST_H #define TEST_H #...

    最近小编由于需要,要在python项目中使用c++的一些类库,遇到一些问题与大家分享。

    首先我在VS中新建空的c++项目,项目结构如下:

    头文件test.h代码如下:

    #pragma once
    
    #ifndef TEST_H
    #define TEST_H
    
    #include <cstring>
    
    
    class test
    {
    public:
    	test();
    	~test();
    
    	double add(double x, double y);
    
    	char* strAdd(char* str1, char* str2);
    };
    
    struct TestStruct
    {
    	double x;
    	double y;
    };
    
    extern "C" __declspec(dllexport) double addd(struct TestStruct &st);
    #endif // !TEST_H
    
    

    源文件test.cpp如下:

    #include "test.h"
    
    test::test()
    {
    }
    
    test::~test()
    {
    }
    
    double test::add(double x, double y)
    {
    	return x + y;
    }
    
    char * test::strAdd(char * str1, char * str2)
    {
    	return strcat(str1, str2);
    }
    
    
    	test t;
    
    	extern "C" __declspec(dllexport) double add(double x, double y) {
    		return t.add(x, y);
    	}
    
    	extern "C" __declspec(dllexport) char* stradd(char * str1, char * str2) {
    		return t.strAdd(str1, str2);
    	}
    
    	double addd(struct TestStruct &st)
    	{
    		st.x = 2.5;
    		st.y = 3.1;
    		return st.x + st.y;
    	}
    
    

     在VS中生成dll,右键项目->属性->常规->项目默认值(配置类型)选择.dll即可,注意你是配置的debug合适release版本与你当前编译版本一致。

    另外我使用的是ctypes类库需要使用c语言编译的dll库,所以需要在方法函数前加extern "C" __declspec(dllexport)这一句__declspec(dllexport)是为了保持函数名称不变,否则编译后函数名称改变导致无法找到对应的函数。相关请看链接:
    Exporting C++ Functions for Use in C-Language Executables
    Exporting from a DLL Using __declspec(dllexport)

    python代码如下(我把生成的dll放在python代码文件同一目录的,你可以随意放置):

    # 开发人员:wxj233
    # 开发时间:2019/12/29 17:22
    
    import ctypes
    
    dll = ctypes.cdll.LoadLibrary("pythonDll.dll")  # 加载库
    
    dll.add.restype = ctypes.c_double  # 指定返回值类型
    dll.add.argtypes = (ctypes.c_double, ctypes.c_double)  # 指定参数类型
    print(dll.add(1.1, 1.4))
    
    
    #  编辑结构体
    class TestStruct(ctypes.Structure):
        _fields_ = [("x", ctypes.c_double), ("y", ctypes.c_double)]
    
    
    testStruct = TestStruct(1, 2)
    
    dll.addd.restype = ctypes.c_double
    print(dll.addd(ctypes.byref(testStruct)))  # ctypes.byref() 传递引用
    print(testStruct.x,testStruct.y)
    

    输出结果:2.5
                      5.6
                      2.5  3.1
    关于ctypes相关可以参考下列文档:
    http://www.360doc.com/content/19/0417/02/9482_829313229.shtml(ctypes中文文档)
    最全ctypes用法总结
    ctypes — A foreign function library for Python
    Python实例浅谈之三Python与C/C++相互调用

    展开全文
  • 1.编译动态链接库 Step 1:创建一个动态链接库项目 如下图,可以直接在所有项目类型里输入关键词搜索,找到对应的动态链接库类型的项目,由于笔者最近用过,所以左侧最近使用的项目模板也会出现。 点击下一步,选择...

    一.前言

    笔者以抛物线函数为例,源程序后缀为.cpp:

    y = a * pow(x, 2) + b * x + c;   // y=ax^2+bx+c
    

    二.编译动态链接库

    Step 1:创建一个动态链接库项目
    (1) 如下图,可以直接在所有项目类型里输入关键词搜索,找到对应的动态链接库类型的项目,由于笔者最近用过,所以左侧最近使用的项目模板也会出现。
    在这里插入图片描述
    (2) 点击下一步,选择路径和项目名称(DynamicLib),与创建一般的工程文件类似,出现下图所示的work space,包含一些自动创建的默认文件:
    在这里插入图片描述
    说明
    (1) 默认头文件包括两个

    /* framework.h */
    #pragma once
    #define WIN32_LEAN_AND_MEAN             // 从 Windows 头文件中排除极少使用的内容
    // Windows 头文件
    #include <windows.h>
    
    
    
    /* pch.h */
    // pch.h: 这是预编译标头文件。
    // 下方列出的文件仅编译一次,提高了将来生成的生成性能。
    // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
    // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
    // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
    #ifndef PCH_H
    #define PCH_H
    // 添加要在此处预编译的标头
    #include "framework.h"
    #endif //PCH_H
    

    (2) 默认源文件包括两个

    // dllmain.cpp : 定义 DLL 应用程序的入口点。
    #include "pch.h"
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    
    
    // pch.cpp: 与预编译标头对应的源文件
    #include "pch.h"
    // 当使用预编译的头时,需要使用此源文件,编译才能成功。
    

    Step 2:写入源文件和头文件信息
    (1) 源程序,直接在pch.cpp源文件里添加:

    // pch.cpp: 与预编译标头对应的源文件
    #include "pch.h"
    // 当使用预编译的头时,需要使用此源文件,编译才能成功。
    
    //我写入的
    double curve(double* parameter)
    {
    	double f;
    	f = parameter[0] * pow(parameter[3], 2) + parameter[1] * parameter[3] + parameter[2];
    	return f;
    }
    

    说明:跟默认的pch.cpp源文件文件内容相比,多了一部分内容:函数的定义。
    此外,还需要在另一个自动生成的源文件 dllmain.cpp里包含 ramework.h头文件

    // dllmain.cpp : 定义 DLL 应用程序的入口点。
    #include "pch.h"
    
    // 我加入的
    #include "framework.h"
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    

    (2) 头文件,直接在pch.h头文件里添加:

    #ifndef PCH_H
    #define PCH_H
    // 添加要在此处预编译的标头
    
    // 我写入的
    // #include "framework.h"
    #include <math.h>
    __declspec(dllexport) double curve(double* parameter);
    
    #endif //PCH_H
    

    说明:跟默认的头文件内容相比,多了两部分内容:函数接口的声明、需要用到的头文件,少了一部分内容:framework.h头文件,在头文件中删掉,而在上面的dllmain.cpp源文件中包含进去。
    注意一定要在函数声明前面加上__declspec(dllexport),否则动态链接库后面只会生成一个.dll文件,而没有.lib文件,无法完成接口库的调用。
    Step 3:生成动态链接库
    (1) 点击 生成–重新生成解决方案 或者 Ctrl+Alt+F7快捷键
    输出结果显示如下即表示编译成功:
    在这里插入图片描述
    (2) 如果前面生成链接库文件选的是debug模式,如下:
    在这里插入图片描述
    那么在项目工程的Debug文件中,可以找到.dll和.lib文件,如图:
    在这里插入图片描述
    这两个文件就是后面调用时候需要用到的

    三.调用动态链接库

    Step 1:创建一个空项目,给个名字(UseDynamicLib)和路径(笔者将动态链接项目和调用的测试项目放在同一个上级文件目录下)
    在这里插入图片描述
    Step 2:将动态链接库里的pch.h头文件、.dll文件、.lib文件复制粘贴到测试空项目的文件夹下,如下图
    在这里插入图片描述
    Step 3:在work space的头文件和资源文件下,分别将刚刚复制过来的三个文件添加进去(右键–添加–现有项)
    在这里插入图片描述
    在这里插入图片描述
    Step 4:最后在源文件中写一个.cpp的demo测试一下前面生成的动态链接库,编译通过,结果正确!
    在这里插入图片描述
    说明:千万不要忘记在.cpp中包含pch.h头文件

    四. 编译和调用静态链接库

    根据动态链接库依法炮制,区别在于:
    1.选择新建一个静态库project:
    在这里插入图片描述
    2.生成的默认文件为:
    在这里插入图片描述
    3. 同样自己不用建头文件和源文件,直接在StaticLib.cpp(名称是自己创建project时候的命名)和pch.h中写入自己的函数:

    // pch.h中写入的,就是函数接口声明和函数定义用到的一些头文件
    # include <math.h>
    double curve(double para_vec[]);
    
    
    
    // StaticLib.cpp中写入的,将自动生成的示例给删掉,重新写
    /* TODO: 这是一个库函数示例
    void fnStaticLib()
    {
    }
    */
    double curve(double* parameter)
    {
    	double f;
    	f = parameter[0] * pow(parameter[3], 2) + parameter[1] * parameter[3] + parameter[2];
    	return f;
    }
    
    1. 将pch.h中的包含framework.h头文件的语句删掉,但是不用在其他文件中添加,这一点跟生成动态链接库有区别
    2. 同样(重新)生成解决方案之后,在工程的Debug文件夹下可以看到.lib文件,但是很大一点区别,只有.lib文件,而动态链接库会生成除.lib之外的.dll文件,这是二者最大的区别。另外提示一下,二者的.lib文件是完全不一样的东西:
      在这里插入图片描述
    3. 因此,当调用静态链接库时候,只需要复制粘贴和添加.h和.lib文件两个文件
      在这里插入图片描述
      8.最后调用的test.cpp程序与动态链接库完全一样,结果也应该一样:
      在这里插入图片描述

    五、总结

    (1) 对于VS2019Community下,创建动态和静态链接项目自动创建的.h和.cpp文件具体意义,这个我相信读者自己点开都能理解;
    (2) 有些头文件和源文件是可以删掉的,但是pch.h和pch.cpp文件不能删,笔者试过,如果删掉,自己另写一个头文件和源文件,重新生成时候编译会报错,所以建议读者还是直接在这些文件里面写自己的东西吧;
    (3) 动态链接库和静态链接库生成时候,pch.h的#include<framework.h>语句都删掉,然后动态链接库里面还有个dllmain.cpp要加上这个头文件,这样后面我们调用库时候,头文件都只需要包含pch.h即可,其他头文件已经编译到动态链接库里面了;
    (4) 动态链接库里pch.h头文件声明函数接口时候,不要忘记加上__declspec(dllexport) ,这个是生成.lib文件的关键一步;
    (5) 总而言之,按照笔者的傻瓜式教程,肯定没问题。
    (6) 另外,关于C语言,直接将所有的后缀改为.c即可,但是不能链接库时候定义的.c,到了调用库时候源文件又写的.cpp,编译也会出现问题,C/C++无法向上兼容

    附录,文中创建的四个文件夹project
    在这里插入图片描述

    展开全文
  • 1. 简介在python、java等...而本文主要介绍的是跨平台编译:针对windows系统中的C++程序在linux编译动态链接库的过程。2. .so及.dll介绍2.1 .dllWindows下动态链接库以 .DLL事实上和 EXE 文件一样,同属 PE 格式...
  • C++编译动态库

    2020-12-10 18:38:16
    c++编译动态库: 参考链接:https://docs.microsoft.com/zh-cn/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-160; 1.建立动态工程; 建立工程后会默认定义一个"*_...
  • C#使用C/C++编译动态链接库dll

    千次阅读 2015-12-27 18:45:49
    C#使用C/C++编译动态连接
  • g++编译动态链接库编译简单的动态链接库代码与文件格式编译与调用1、生成动态链接库2、编译调用生成的动态库3、添加环境变量路径4、运行编译依赖第三方库(opencv)的动态链接库代码与文件格式编译与调用 编译简单的...
  • C++动态链接库编译和调用
  • 在网上看了看,最后选择了将C++代码编译动态链接库,然后用python调用其接口 要让函数能被外部程序调用,需要对函数声明做一定处理 在windows下,要被外部调用的函数要被声明为 // windows下声明对外调用的函数 ...
  • C使用C++编译出来的动态链接库,C++使用C编译出来的动态链接库,C使用C编译出来的动态链接库,C++使用C++编译出来的动态链接库……最近和师兄们搭伴做加密系统,自己负责加密算法部分,师兄们负责更加底层的硬件接口...
  • 【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇2-编译jsoncpp 附:当前项目cstudy7 本文可以收获什么? 将其它项目生成的动态链接库拿到本项目中使用 CMakeLists.txt中使用其它项目的动态链接...
  • Linux中C++编译、使用动态链接库

    千次阅读 2018-02-07 15:44:58
    Linux中so为共享动态链接库。下面我们通过一个四则运算的实例来学习动态链接库。 首先是头文件:my_math.h: /** * my_math.h */ // a + b int Add(int a, int b); // a - b int Minus(int a, int b); // a ...
  • C++ 有两种链接库分为动态链接库和静态链接库,如果用VS IDE去生成相关的链接库 只需在工程属性上分别设置为静态链接库和DLL 即可得到相关不同的链接库 对于静态链接库由于在使用的时候生成巨大的.lib文件,通常...
  • 前几天需要在Linux下编译一个动态链接库,只知道加载不到对应的so文件,后面找到一篇英文博客,感觉有思路了,写的很明白,安利一波。 博客链接: 点一下我.
  • 动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记, 也为其它正为动态链接库而苦恼的兄弟们提供一点帮助。 ...
  • NULL 博文链接:https://cherishlc.iteye.com/blog/2265220
  • 1. 简介在python、java等...而本文主要介绍的是跨平台编译:针对windows系统中的C++程序在linux编译动态链接库的过程。2. .so及.dll介绍2.1 .dllWindows下动态链接库以 .DLL事实上和 EXE 文件一样,同属 PE 格式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,379
精华内容 951
关键字:

c++编译动态链接库

c++ 订阅