从非托管C++; 我现在有一个控制台应用程序,用非托管C++编写,源代码包括入口点主代码>代码>以及其他一些功能。我需要从这个代码中创建一个DLL,这样我就可以从其他项目中使用它,特别是从托管C++中使用。(另一个问题:我是否需要为此编写一个包装器类?) 我知道管理/非托管C++和创建DLL几乎没有什么,我遵循并设法通过只使用VS2010(不CMAP)来获得并运行一个简单的Hello World DLL。

从非托管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,更改了您的产品线,并按预

但是,我的这个项目有很多依赖项(例如),因此我通常使用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();
    }