C++生成dll和调用dll以及利用CMAKE生成c++ dll的问题

一、dll生成
1、设置项目属性:打开vs,建立空项目,在项目的  配置属性->常规->项目默认值->配置类型 修改为:动态库(.dll)
2、准备文件:填写头文件和源文件,注意头文件的声明,源文件正常。
—————————————————————————————————————
|  头文件:                                                                                                                   |
|  // __declspec详解请见https://blog.csdn.net/zhangzq86/article/details/52982939/   |
|  #define DLLEXPORT __declspec(dllexport)                                                            |                
|                                                                                                                                   |
|  extern "C"                                                                                                                 |
|  {                                                                                                                                |
|    DLLEXPORT void print_sss(string &sss);                                                              |
|  }                                                                                                                                |
—————————————————————————————————————
3. 配置管理器(如Debug\x64),生成解决方案。
4. 在相应的项目文件夹下查看.dll、.lib文件,连同头文件.h一起拷贝到容易寻找的位置。

二、dll使用
使用方法一(尽可能少地配置项目属性)
1、建立项目,完成代码编写;
2、拷贝文件,将.lib .h文件拷贝到.cpp的同级目录
3、设置项目属性,配置属性->链接器->输入->附加依赖项 中填入.lib文件完整的文件名
4、生成解决方案
5、拷贝文件,将.dll文件拷贝到.exe文件的同级目录
6、运行程序。

三、CMAKE生成动态链接库dll
1.建立空的文件和目录: 新建文件夹(主文件夹),并在其中建立main.cpp和lib文件夹,
  在lib文件夹下,准备头文件(mydll.h)和源文件(mydll.cpp),
  同时在两级文件夹下都建立Cmakelists.txt;
2.准备好mydll.h,mydll.cpp和main.cpp;
3.准备Cmakelists.txt文件:
(1)先准备lib文件下的Cmakelists.txt
===============================================
#设置目录
SET(LIBSRC ./my_dll.h ./my_dll.cpp)
SET(LIBRARY_OUTPUT_PATH  ../libdll)

# 第一个参数为你需要构建的dll的名字,第二个为类型
ADD_LIBRARY(add SHARED ${LIBSRC})
INSTALL(TARGETS add)
# 为dll设置linker
# 指定dll的生成目录,这里是:../libdll
#指定dll名称和前缀
SET_TARGET_PROPERTIES(add PROPERTIES LINKER_LANGUAGE C
        RUNTIME_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
        LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
        OUTPUT_NAME "add"
        PREFIX "")
===============================================
(2)再准备主目录下的Cmakelists.txt
===============================================
cmake_minimum_required(VERSION 3.16)

#项目名称
project(run_dll)
# 版本
set(CMAKE_CXX_STANDARD 17)

# 声明引入子项目(目录)
ADD_SUBDIRECTORY(lib)

#生成可执行文件
add_executable(run_dll run_dll.cpp)
#拷贝.dll文件到.exe所在的同级目录下
execute_process( COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/libdll/Debug/add.dll ${CMAKE_CURRENT_SOURCE_DIR}/Debug)
#链接库
target_link_libraries(${PROJECT_NAME} PUBLIC  ./libdll/Debug/add)
#包含头文件
target_include_directories(${PROJECT_NAME} PUBLIC
    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/lib>
    $<INSTALL_INTERFACE:include>)
===============================================
4.在CMAKE中配置、生成项目文件;
5.在VS中运行。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 C++调用 C# DLL,您需要使用 C++/CLI 中介。C++/CLI 是一种 C++ 扩展,可以让您使用 .NET 类型和对象。这意味着您可以编写 C++/CLI 代码来调用 .NET 程序集中的类和方法。 下面是一个简单的示例,展示了如何使用 C++/CLI 从 C++调用 C# DLL 中的方法。 首先,您需要编写 C++/CLI 包装器类,该类将调用 C# DLL 中的方法。例如,假设您的 C# DLL 包含一个名为 `MyClass` 的类,并且该类有一个名为 `MyMethod` 的方法,您可以编写以下 C++/CLI 代码: ```cpp #pragma once using namespace System; using namespace System::Runtime::InteropServices; namespace MyNamespace { public ref class MyClassWrapper { private: IntPtr m_handle; public: MyClassWrapper() { m_handle = LoadLibrary("MyDll.dll"); } ~MyClassWrapper() { FreeLibrary((HMODULE)m_handle.ToPointer()); } int MyMethod(int arg1, int arg2) { typedef int(__stdcall *MyMethodFunc)(int, int); MyMethodFunc myMethod = (MyMethodFunc)GetProcAddress((HMODULE)m_handle.ToPointer(), "MyMethod"); return myMethod(arg1, arg2); } }; } ``` 这个包装器类将加载 C# DLL调用 `MyMethod` 方法。请注意,`MyMethod` 方法的签名必须与 C# DLL 中的方法签名匹配。在此示例中,假设 `MyMethod` 是一个 `int` 返回类型的方法,它接受两个 `int` 参数。 接下来,您需要在 C++ 代码中使用 C++/CLI 包装器类。例如,您可以编写以下 C++ 代码: ```cpp #include <iostream> #include "MyClassWrapper.h" using namespace std; using namespace MyNamespace; int main() { MyClassWrapper^ wrapper = gcnew MyClassWrapper(); int result = wrapper->MyMethod(1, 2); cout << "Result: " << result << endl; return 0; } ``` 这将创建一个 `MyClassWrapper` 对象,并调用 `MyMethod` 方法。请注意,您需要使用 `^` 符号来声明包装器类的引用。 最后,您需要使用 CMake 编译您的代码。您需要确保将 C++/CLI 文件添加到项目中,并将 C# DLL 文件添加到可执行文件的目录中。例如,您可以编写以下 CMakeLists.txt 文件: ``` cmake_minimum_required(VERSION 3.10) project(MyProject) set(CMAKE_CXX_STANDARD 11) add_executable(MyExecutable main.cpp MyClassWrapper.cpp) set_property(TARGET MyExecutable PROPERTY VS_DOTNET_REFERENCES "MyDll.dll" ) configure_file(MyDll.dll MyDll.dll COPYONLY) ``` 这将编译您的代码,并将 `MyDll.dll` 复制到可执行文件的目录中。 希望这可以帮助您开始在 C++调用 C# DLL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值