【发布时间】:2014-01-13 10:24:36
【问题描述】:
我有以下文件:
hello.h
#ifndef HELLO_H
#define HELLO_H
class Hello {
private:
int _number;
public:
Hello(int number);
void printHello(void) const;
};
#endif
hello.cpp
#include "hello.h"
#include <iostream>
Hello::Hello(int number)
: _number(number) {
}
void Hello::printHello(void) const {
std::cout << "Hello, " << this->_number << std::endl;
}
hello.swg
%module hello
%{
#include "hello.h"
%}
%include "hello.h"
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FIND_PACKAGE(Lua51)
INCLUDE_DIRECTORIES(${LUA_INCLUDE_DIR})
ADD_LIBRARY(
"hello"
SHARED
"hello_wrap.cxx"
"hello.cpp"
)
TARGET_LINK_LIBRARIES(hello "${LUA_LIBRARIES}")
SET_TARGET_PROPERTIES(hello PROPERTIES PREFIX "")
我使用 SWIG 生成 hello_wrap.cxx,然后通过 CMake 创建 MinGW Makefile 并构建它们。这会产生 hello.dll。
打开lua解释器,我输入:
hello=require('hello')
inst=hello.Hello(23)
inst:printHello()
正如预期的那样,我希望它打印出“你好,23”,因此模块加载似乎正常工作。
但是,当我这样做时:
os.exit()
我收到以下错误:
"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."
随后 lua.exe 崩溃。当我简单地这样做时也会发生这种情况:
hello=require('hello')
os.exit()
有人对我如何解决这个问题有任何想法吗?
提前致谢。
编辑:以下是depends.exe通过lua.exe运行带有问题行的test.lua时产生的输出
***************************| Module Dependency Tree |***************************
* *
* Legend: F Forwarded Module ? Missing Module 6 64-bit Module *
* D Delay Load Module ! Invalid Module *
* * Dynamic Module E Import/Export Mismatch or Load Failure *
* ^ Duplicate Module *
* *
********************************************************************************
[ ] LUA.EXE
[ ] KERNEL32.DLL
[ ] API-MS-WIN-CORE-RTLSUPPORT-L1-1-0.DLL
[ ] NTDLL.DLL
[ ] KERNELBASE.DLL
[ ^ ] NTDLL.DLL
[ ] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL
[ ] API-MS-WIN-CORE-HEAP-L1-1-0.DLL
[ ] API-MS-WIN-CORE-MEMORY-L1-1-0.DLL
[ ] API-MS-WIN-CORE-HANDLE-L1-1-0.DLL
[ ] API-MS-WIN-CORE-SYNCH-L1-1-0.DLL
[ ] API-MS-WIN-CORE-FILE-L1-1-0.DLL
[ ] API-MS-WIN-CORE-IO-L1-1-0.DLL
[ ] API-MS-WIN-CORE-THREADPOOL-L1-1-0.DLL
[ ] API-MS-WIN-CORE-LIBRARYLOADER-L1-1-0.DLL
[ ] API-MS-WIN-CORE-NAMEDPIPE-L1-1-0.DLL
[ ] API-MS-WIN-CORE-MISC-L1-1-0.DLL
[ ] API-MS-WIN-CORE-SYSINFO-L1-1-0.DLL
[ ] API-MS-WIN-CORE-LOCALIZATION-L1-1-0.DLL
[ ] API-MS-WIN-CORE-PROCESSENVIRONMENT-L1-1-0.DLL
[ ] API-MS-WIN-CORE-STRING-L1-1-0.DLL
[ ] API-MS-WIN-CORE-DEBUG-L1-1-0.DLL
[ ] API-MS-WIN-CORE-ERRORHANDLING-L1-1-0.DLL
[ ] API-MS-WIN-CORE-FIBERS-L1-1-0.DLL
[ ] API-MS-WIN-CORE-UTIL-L1-1-0.DLL
[ ] API-MS-WIN-CORE-PROFILE-L1-1-0.DLL
[ ] API-MS-WIN-SECURITY-BASE-L1-1-0.DLL
[F^ ] NTDLL.DLL
[ ] MSVCRT.DLL
[ ^ ] KERNELBASE.DLL
[ ^ ] NTDLL.DLL
[ ] API-MS-WIN-CORE-CONSOLE-L1-1-0.DLL
[ ] API-MS-WIN-CORE-DATETIME-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-DEBUG-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-ERRORHANDLING-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-FIBERS-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-FILE-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-HANDLE-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-HEAP-L1-1-0.DLL
[ ] API-MS-WIN-CORE-INTERLOCKED-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-LOCALIZATION-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-LIBRARYLOADER-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-MEMORY-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-MISC-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-NAMEDPIPE-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-PROCESSENVIRONMENT-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-PROFILE-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-STRING-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-SYNCH-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-SYSINFO-L1-1-0.DLL
[ ^ ] API-MS-WIN-CORE-UTIL-L1-1-0.DLL
[ ^ ] MSVCRT.DLL
[ ] LUA52.DLL
[ ^ ] KERNEL32.DLL
[F^ ] NTDLL.DLL
[ ^ ] MSVCRT.DLL
[* ] HELLO.DLL
[ ^ ] KERNEL32.DLL
[F^ ] NTDLL.DLL
[ ^ ] MSVCRT.DLL
[ ] LIBGCC_S_DW2-1.DLL
[ ^ ] KERNEL32.DLL
[F^ ] NTDLL.DLL
[ ^ ] MSVCRT.DLL
[*^ ] LIBGCC_S_DW2-1.DLL
[ ] LIBSTDC++-6.DLL
[ ^ ] KERNEL32.DLL
[F^ ] NTDLL.DLL
[ ^ ] MSVCRT.DLL
[ ^ ] MSVCRT.DLL
[ ^ ] LIBGCC_S_DW2-1.DLL
[*^ ] LIBGCC_S_DW2-1.DLL
[*^ ] LIBGCC_S_DW2-1.DLL
[* ] SNXHK.DLL
[ ^ ] KERNEL32.DLL
[F^ ] NTDLL.DLL
[*^ ] KERNEL32.DLL
编辑:添加了来自 'cmake -G "MinGW Makefiles"' 的输出和构建
cmake -G "MinGW Makefiles"
-- The C compiler identification is GNU 4.8.1
-- The CXX compiler identification is GNU 4.8.1
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found Lua51: C:/Users/forgottenmaster/Dropbox/lua/lua-5.2.3/src/liblua.a
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/forgottenmaster/Dropbox/lua/modules/c++
mingw32-make
Scanning dependencies of target hello
[ 50%] Building CXX object CMakeFiles/hello.dir/hello_wrap.cxx.obj
[100%] Building CXX object CMakeFiles/hello.dir/hello.cpp.obj
Linking CXX shared library hello.dll
[100%] Built target hello
【问题讨论】:
-
你能在调试器中运行这个以便你可以捕获吗?
-
如果您删除
os.exit()并用Ctrl-Z替换它会怎样?如果您使用该组合键退出解释器,它仍然会崩溃吗? -
我找不到像样的 lua 调试器,我尝试 LuaEdit 进行调试,但它只是崩溃了,没有任何意义。使用 lua API 从 C++ 运行脚本,通过 gdb 在脚本退出时出现以下错误 “程序收到信号 SIGSEGV, Segmentation fault. 0x775ddfe4 in ntdll!RtlFreeHeap () from C:\Windows\system32\ntdll .dll”。另外,Ctrl+C组合退出lua解释器没有错误
-
如果您在没有
os.exit()的情况下运行测试脚本,会出现段错误吗?我相信os.exit只是在下面调用 abort 或终止,因此可能不会完成任何需要进行的清理。 -
lua.exe链接到哪个 C 运行时?默认情况下,MinGW 将链接到MSVCRT.DLL,而不是任何较新的 Visual C 版本。 Lua for Windows 是(IIRC)链接到MSVCR80.DLL。混合 C 运行时将导致最终的痛苦,这通常是由于多个内存分配器与从一个版本的malloc()收到的指针传递给另一个版本的free()造成的混淆。查看正在发生的事情的最佳方法是使用DEPENDS.EXE找出真正在使用的 DLL。