从非托管C++; 我现在有一个控制台应用程序,用非托管C++编写,源代码包括入口点主代码>代码>以及其他一些功能。我需要从这个代码中创建一个DLL,这样我就可以从其他项目中使用它,特别是从托管C++中使用。(另一个问题:我是否需要为此编写一个包装器类?) 我知道管理/非托管C++和创建DLL几乎没有什么,我遵循并设法通过只使用VS2010(不CMAP)来获得并运行一个简单的Hello World DLL。
但是,我的这个项目有很多依赖项(例如),因此我通常使用CMake生成Visual Studio 2010解决方案,然后将其构建到可执行文件中,如中所述。如何使用CMake构建将构建到DLL中的VS2010项目 总结一下我的问题:从非托管C++; 我现在有一个控制台应用程序,用非托管C++编写,源代码包括入口点主代码>代码>以及其他一些功能。我需要从这个代码中创建一个DLL,这样我就可以从其他项目中使用它,特别是从托管C++中使用。(另一个问题:我是否需要为此编写一个包装器类?) 我知道管理/非托管C++和创建DLL几乎没有什么,我遵循并设法通过只使用VS2010(不CMAP)来获得并运行一个简单的Hello World DLL。,c++,visual-studio-2010,dll,cmake,unmanaged,C++,Visual Studio 2010,Dll,Cmake,Unmanaged,但是,我的这个项目有很多依赖项(例如),因此我通常使用CMake生成Visual Studio 2010解决方案,然后将其构建到可执行文件中,如中所述。如何使用CMake构建将构建到DLL中的VS2010项目 总结一下我的问题: 我有一个非托管C++代码的项目,需要大量的依赖关系。 我想从这个代码中创建一个DLL,它可以从托管C++调用。 额外资料: Windows 7、Visual Studio 2010旗舰版、CMake 2.8.10.2 编辑: 我使用了CMake,更改了您的产品线,并按预
#ifdef MyLib_EXPORTS
#define API_DECL __declspec( dllexport )
#else
#define API_DECL __declspec( dllimport )
#include <iostream>
#include <pcl/...>
etc...
API_DECL void myFirstFunction();
API_DECL void mySecondFunction();
#endif
#ifdef MyLib_导出
#定义API_DECL_declspec(dllexport)
#否则
#定义API_DECL_declspec(dllimport)
#包括
#包括
等
API_DECL void myFirstFunction();
API_DECL void mySecondFunction();
#恩迪夫
MyCode.cpp:我没有对源文件做任何更改,是否应该做任何更改?不幸的是,我无法帮助您处理托管代码部分,但这就是您在CMake中创建DLL的方式: 首先,不要使用
`ADD_EXECUTABLE( YourLib SHARED yourclass.cpp yourclass.h )`
在CMakeLists.txt
中,使用
`ADD_LIBRARY( YourLib SHARED yourclass.cpp yourclass.h )`
这将配置解决方案以创建DLL而不是可执行文件
但是,要在项目中使用此DLL,需要导出要使用的符号。为此,您需要向类和/或函数声明中添加\uu declspec(dllexport)
。构建库将产生两个文件,一个.dll和一个.lib
。后一个是所谓的导入库,当您希望在其他项目中使用此库时,需要它。运行时需要.dll
但是:当您想使用库时,需要使用\u declspec(dllimport)
(而不是dllexport
)。为了避免使用两个头文件,通常的方法是使用预处理器。CMake实际上通过在库项目中提供YourLibrary\u导出定义来帮助您
总结如下:
#ifndef YOUR_CLASS_H
#define YOUR_CLASS_H
#ifdef YourLib_EXPORTS
#define API_DECL __declspec( dllexport )
#else
#define API_DECL __declspec( dllimport )
#endif
class APIDECL YourClass {
void foo();
void bar();
};
#endif // YOUR_CLASS_H
编辑:
如果您希望能够使用C中的那些函数(以及能够使用C函数的语言),那么应该使用extern“C”{
谢谢!我只想检查一些东西。这是否意味着我的函数声明,例如mainFunc(int a)
应该更改为\u declspec(dllexport)mainFunc(int a)
?不,您不会导出main
函数(至少不是main
或WinMain
)。这将与链接到此库的可执行文件中的主函数冲突。但是,如果在加载dll时需要调用特定代码,请查看[.抱歉弄乱了前面评论中的链接:这是正确的,我想我明白了。这意味着我只需要重新声明那些我想从外部访问的函数?在我的情况下,只需要访问main
函数就足够了,所以我应该选择只使用它吗DllMain
?如果它是您想在外部使用的函数(它是一个库),我很清楚地建议以不同的方式调用您的函数。然后用该名称调用它。在包含iostream
之前,您的#endif
应该关闭。我想我的DLL已经正常工作了。现在来处理非托管/托管情况。谢谢!
extern "C" {
API_DECL void myFirstFunction();
API_DECL void mySecondFunction();
}