使用clang构建wxWidgets时,'dllimport'属性被忽略并且未定义引用错误

时间:2017-12-09 12:05:43

标签: c++ clang wxwidgets

我非常需要在当前项目的 Windows 上使用 clang 构建 wxWidgets ,并且我已经构建了 wxWidgets 3.0。使用 mingw-w64 7.2.0,64 bit,seh,posix在具有原生 clang llvm 5.0.0 的窗口上 3.1.0 线程标准库和工具( x86_64-w64-windows-gnu 目标)。样品正在运作。但除了主要的,我无法链接dll。所以我无法在单片共享版本中构建opengl dll,并且所有dll都使用MONOLITHIC = 0。标头/预编译标头有一些错误。编译时我有很多redeclared inline; 'dllimport' attribute ignored警告,如:

In file included from ../../src/xrc/xmlreshandler.cpp:18:
In file included from ..\..\include\wx/xrc/xmlreshandler.h:22:
In file included from ..\..\include\wx/window.h:18:
..\..\include\wx/event.h:3750:35: warning: 'wxObjectEventFunctor::operator()' redeclared inline; 'dllimport' attribute ignored [-Wignored-attributes]
inline void wxObjectEventFunctor::operator()(wxEvtHandler *handler, wxEvent& even

t)的

然后链接器undefined reference错误如:

 clang_mswuddll-forest\coredll_appcmn.o:(.rdata[_ZTV12wxAppConsole]+0x1e0): undefined reference to `non-virtual thunk to wxAppConsoleBase::FilterEvent(wxEvent&)'

在单片构建的情况下,我在编译阶段仅在文件src/common/glcmn.cpp中发出警告,因此我使用以下命令编译了库:

mingw32-make.exe -f makefile.gcc MONOLITHIC=1 SHARED=1 BUILD=debug USE_OPENGL=0 CFLAGS=" -Wno-inconsistent-missing-override -Wno-shift-negative-value -Wno-unused-command-line-argument " CXXFLAGS=" -Wno-inconsistent-missing-override -Wno-shift-negative-value -Wno-unused-command-line-argument -fexceptions -fasynchronous-unwind-tables -fnon-call-exceptions -std=gnu++11 -pthread " LDFLAGS=" -Wno-unused-command-line-argument -fexceptions -fasynchronous-unwind-tables -fnon-call-exceptions -pthread -Wl,--allow-multiple-definition "  CC="clang -target x86_64-w64-windows-gnu" CXX="clang++ -target x86_64-w64-windows-gnu"

我在构建wxWidgets 3.1.0 vesrion时只修补了两个文件以避免错误:include/wx/msw/private.hsrc/msw/mediactrl_am.cppsrc/msw/mediactrl_am.cpp中,我更改了case中的常量:

case -609: // readystatechange in IActiveMovie2 and IMediaPlayer

并在include/wx/msw/private.h我更改了有错误的行:

// close the handle in the class dtor
//template <wxUIntPtr INVALID_VALUE = (wxUIntPtr)INVALID_HANDLE_VALUE>
template <wxUIntPtr INVALID_VALUE = (wxUIntPtr)-1>
class AutoHANDLE

static HANDLE InvalidHandle()
{
    //return static_cast<HANDLE>(INVALID_VALUE);
    return reinterpret_cast<HANDLE>(INVALID_VALUE);
}

在我的工作中安装像 MSYS2 这样的工具非常困难,所以我想避免使用configure

在我的情况下,有没有办法修复使用clang构建的wxWidgets dll?

0 个答案:

没有答案