VS调试F11进不到dll源码

来源:互联网 发布:漫步者da500调音软件 编辑:程序博客网 时间:2024/06/07 23:55

  最近研究Amazon的aws-sdk-cpp,是开源的代码,至少要用VS2013进行编译,因为代码中用到了C++11的新语法。

  用cmake生成了VS2017的工程,编译顺利的通过了。然后写了个简单的测试工程,能正确的编译和运行,可是调试时发现F11始终进不到dll的源码,而在dll源码里打上断点后,F5运行却能在dll源码断点处停下来。印象中之前也有遇到过,一直没有找出原因。今天花了一上午的时间来研究,终于发现了问题。

#if defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)    #ifdef _MSC_VER        #pragma warning(disable : 4251)    #endif // _MSC_VER    #ifdef USE_IMPORT_EXPORT        #ifdef AWS_CORE_EXPORTS            #define  AWS_CORE_API __declspec(dllexport)        #else // AWS_CORE_EXPORTS            #define  AWS_CORE_API __declspec(dllimport)        #endif // AWS_CORE_EXPORTS    #else // USE_IMPORT_EXPORT        #define AWS_CORE_API    #endif // USE_IMPORT_EXPORT#else // defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)    #define AWS_CORE_API#endif // defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)
  以上是aws-sdk-cpp定义的导入导出宏定义,aws-sdk定义了USE_WINDOWS_DLL_SEMANTICS、WIN32、USE_IMPORT_EXPORT和AWS_CORE_EXPORTS,这样宏AWS_CORE_API就被定义为__declspec(dllexport),表示从dll中导出相关符号。

  而我写的测试工程,只定义了WIN32,最终宏AWS_CORE_API定义为空,在把aws-sdk头文件include后,相关函数的定义“AWS_CORE_API void InitAPI(const SDKOptions& options);”就变成了“void InitAPI(const SDKOptions& options);”,没有__declspec(dllimport),这样也能编译通过并且正确运行,但是F11就是进不到dll源码里面。以前的认知是要导入函数,必须加__declspec(dllimport),但是今天才发现,原来不用__declspec(dllimport)定义函数,也能成功。

  然后我就在测试工程里加上了USE_IMPORT_EXPORT,编译调试,再F11就能进入到dll源码了。


原创粉丝点击