使用具有最小C++/SWIG/Lua代码 这是一个涉及C++、SWIG和LUA的非常具体的编译问题。

使用具有最小C++/SWIG/Lua代码 这是一个涉及C++、SWIG和LUA的非常具体的编译问题。,c++,lua,shared-libraries,swig,undefined-reference,C++,Lua,Shared Libraries,Swig,Undefined Reference,我有一个非常简单的基本代码: [AClass.hpp] 类AClass{ 公众: AClass(); }; [AClass.cpp] #包括“AClass.hpp” AClass::AClass(){} [main.cpp] #包括“AClass.hpp” int main(){ 我的课堂; } 在这一点上,与编译无关。 我首先在libengine.dll中编译该类,然后使用共享库构建可执行文件 让我们介绍一个SWIG模块,并将其添加到dll中: [类别一] 此后,在链接可执行文件中的所有

我有一个非常简单的基本代码:

[AClass.hpp]

类AClass{
公众:
AClass();
};
[AClass.cpp]

#包括“AClass.hpp”
AClass::AClass(){}
[main.cpp]

#包括“AClass.hpp”
int main(){
我的课堂;
}
在这一点上,与编译无关。 我首先在libengine.dll中编译该类,然后使用共享库构建可执行文件

让我们介绍一个SWIG模块,并将其添加到dll中:

[类别一]

此后,在链接可执行文件中的所有内容时,我出现以下错误:

g++ -c main.cpp
g++ -c AClass.cpp
swig.exe -c++ -lua AClass.i
g++ -Iinclude -c AClass_wrap.cxx
g++ AClass.o AClass_wrap.o -shared -o libengine.dll -Wl,--out-implib,libengine.dll.a -L. -llua5.1
Creating library file: libengine.dll.a
g++ main.o libengine.dll.a -o main.exe
main.o:main.cpp:(.text+0x16): undefined reference to `AClass::AClass()'
collect2: ld returned 1 exit status
有人有线索吗?我尝试使用nm查看dll,但我不知道向共享库添加另一个.o如何“隐藏”方法(这不是特定于构造函数的)


为了重现上下文,以下是构建测试所需的目录中的必要文件:

include/ # Contains "lauxlib.h", "lua.h" & "luaconf.h"
liblua5.1.dll
AClass.hpp
AClass.cpp
AClass.i
main.cpp
Makefile
最后,这里是Makefile内容:

ifneq(,$(findstringlinux,$(shell uname-o)))
EXEC:=main
LIB:=libengine.so
库标志:=-o$(库)
其他的
EXEC:=main.exe
LIB:=libengine.dll.a
LIB_标志:=-o libengine.dll-Wl,--out implib,$(LIB)
#在CMake中使用“.dll.a”(选项:-Wl,--out implib,)或仅使用“.dll”没有区别
ifdef系统根
#纯窗户,没有Cygwin
RM:=del/Q
恩迪夫
恩迪夫
语言库:=-L.-llua5.1
LANG_INC:=包括
朗格斯威格:=-lua
全部:清洁$(执行)
清洁:
$(RM)main*.exe*_wrap.cxx*.o libengine*
$(EXEC):main.o$(LIB)
g++$^-o$@
main.o:main.cpp
g++-c$<
#没有PB而不依赖于AClass\u wrap.o
$(LIB):AClass.o AClass\u wrap.o
g++$^-共享$(语言库)$(库标志)
AClass.o:AClass.cpp
g++-fPIC-c$<
AClass\u wrap.o:AClass\u wrap.cxx
g++-fPIC-I$(朗欧公司)-c$<
AClass\u wrap.cxx:AClass.i
swig-c++$(LANG_swig)$<
这是在WindowsSeven下测试的,使用的是MingWg++v4.5.2、Swig2.0.2和Lua5.1


编辑:SWIG导出到tcl时也会出现此问题。但是,在Linux下编译绝对没有问题。我比较了生成的AClass\u wrap.cxx,它们是相似的。

mingw下的g++可能需要u declspec(dlliport/export)

非常感谢!我从未找到解决方案,最终决定忘记共享库。下次我会试试的!
include/ # Contains "lauxlib.h", "lua.h" & "luaconf.h"
liblua5.1.dll
AClass.hpp
AClass.cpp
AClass.i
main.cpp
Makefile