C++ 如何在Windows上编写模块?

C++ 如何在Windows上编写模块?,c++,visual-studio,module,C++,Visual Studio,Module,我目前正在写一个程序,应该可以在Windows和Linux上运行。该程序使用动态模块(LoadLibrary/dlopen)简化不同功能的部署 Linux部分工作得很好:主程序使用-Wl、-export-dynamic导出函数和变量,以便模块可以访问它们,并且可以使用gcc的-shared选项编译模块,而无需在链接时解析所有符号依赖关系 对于Windows(使用MSVC 2010),这似乎不起作用。我正在使用uu declspec(dllimport)从主程序导出函数和变量,但我无法从主程序访问

我目前正在写一个程序,应该可以在Windows和Linux上运行。该程序使用动态模块(LoadLibrary/dlopen)简化不同功能的部署

Linux部分工作得很好:主程序使用-Wl、-export-dynamic导出函数和变量,以便模块可以访问它们,并且可以使用gcc的-shared选项编译模块,而无需在链接时解析所有符号依赖关系

对于Windows(使用MSVC 2010),这似乎不起作用。我正在使用uu declspec(dllimport)从主程序导出函数和变量,但我无法从主程序访问函数和变量,因为链接失败(未解析外部,LNK1120)

如何应对?多谢各位

编辑(代码示例):

core-file.cpp

core-file.hpp

模块.cpp

\uu declspec(dllimport)
用于编译使用DLL的程序时。编译实际DLL时,您希望使用
\uuu declspec(dllexport)

您对这些的使用必须保持一致。典型的习惯用法是定义一个宏,根据宏的存在使用dllimport和dllexport。在构建DLL的项目中,定义宏意味着导出函数,而在其他项目中,不定义宏意味着导入函数:

#ifdef PROJECT_NAME_BUILD_DLL
  #define DLL_SYMBOL __declspec(dllexport)
#else //PROJECT_NAME_BUILD_DLL
  #define DLL_SYMBOL __declspec(dllimport)
#endif //PROJECT_NAME_BUILD_DLL

DLL_SYMBOL void SomeFunction(Type value);

构建DLL的项目将定义
project\u NAME\u BUILD\u DLL
;使用包含此标题的DLL的项目不定义此标题。

在Windows上,当您要链接导出的符号时,必须记住指定链接要导入符号的模块时生成的所有导入库。(您可以在Linux上不解析符号,因为可执行文件格式不同,并且可能会将符号解析延迟到加载时间。)

请发布出现问题的代码。您的一些陈述没有多大意义(例如,“我正在导出函数…使用
\uu declspec(dllimport)
;”您的意思是
dllexport
?您的意思是导入函数吗?)。DLL有一个LibMain。您是否在VS 2010项目的配置属性中设置了正确的配置类型?当您已经在Linux上使用GCC时,为什么还要在Windows上使用MSVC?在所有平台上使用GCC,这将使您的工作更容易,问题更少。这是我记得的——所以即使在Windows上使用GCC,这也是不可能的。非常感谢。
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif

class TEST_API Cls_A {
public:
    void do_something();
};

extern Cls_A cls_instance;
#include "core-file.hpp"

TEST_API int my_init_function() {
    cls_instance.do_something();
    return 0;
}
#ifdef PROJECT_NAME_BUILD_DLL
  #define DLL_SYMBOL __declspec(dllexport)
#else //PROJECT_NAME_BUILD_DLL
  #define DLL_SYMBOL __declspec(dllimport)
#endif //PROJECT_NAME_BUILD_DLL

DLL_SYMBOL void SomeFunction(Type value);