Reputation: 348
I have minimal example of a program. It functions when compiled as an app, but fails as a shared library. Why is this?
interface.h
#include <QObject>
#include <QApplication>
#include <QPushButton>
#include <QThread>
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
EXTERNC void initialize();
#undef EXTERNC
class Q_DECL_EXPORT SharedLibrary :public QObject {
Q_OBJECT
public:
SharedLibrary();
private:
QCoreApplication * app;
};
interface.cpp
#include "interface.h"
#define UNUSED(x) (void)(x)
SharedLibrary::SharedLibrary() {
int argc = 1;
char* argv[] = { (char*)"sharedlibrary.lib", NULL };
app = new QApplication(argc, argv);
QPushButton button("Hello World");
button.show();
app->exec();
}
void initialize() {
new SharedLibrary();
return;
}
int main (int argc, char** argv) {
UNUSED(argc);
UNUSED(argv);
new SharedLibrary();
return 0;
}
When I compile my application as an app and run main
it works just fine. When I compile my application as a lib and run initialize
it crashes. Interestingly enough, the same exact code works on Linux. Full stack trace below:
arithmetic error FLOATING-POINT-INVALID-OPERATION signalled
[Condition of type FLOATING-POINT-INVALID-OPERATION]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1002E605A3}>)
Backtrace:
0: ("bogus stack frame")
1: ("foreign function: CUIDraw")
2: ("foreign function: _HIThemeCUIDrawWithOptions")
3: ("foreign function: _HIThemeCUIDrawWithRenderer")
4: ("foreign function: _HIThemeDrawAppleMenuTitle")
5: ("foreign function: _ZN13HIMenuBarView8DrawOnceE6CGRectS0_bbP9CGContext")
6: ("foreign function: _ZN13HIMenuBarView8DrawSelfEsPK9__HIShapeP9CGContext")
7: ("foreign function: _ZN6HIView12EventHandlerEP25OpaqueEventHandlerCallRefP14OpaqueEventRefPv")
8: ("foreign function: _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec")
9: ("foreign function: _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec")
10: ("foreign function: SendEventToEventTargetWithOptions")
11: ("foreign function: _ZN6HIView8SendDrawEsP13OpaqueGrafPtrPK9__HIShapeP9CGContext")
12: ("foreign function: _ZN6HIView23RecursiveDrawCompositedEPK9__HIShapeS2_jPS_P9CGContexthd")
13: ("foreign function: _ZN6HIView23RecursiveDrawCompositedEPK9__HIShapeS2_jPS_P9CGContexthd")
14: ("foreign function: _ZN6HIView14DrawCompositedEsP13OpaqueGrafPtrPK9__HIShapejPS_P9CGContext")
15: ("foreign function: _ZN6HIView6RenderEjP9CGContext")
16: ("foreign function: _ZN10WindowData20PrepareForVisibilityEv")
17: ("foreign function: _ShowHideWindows")
18: ("foreign function: ShowHide")
19: ("foreign function: _ZN9MBWindows18GetWindowOnDisplayEjh")
20: ("foreign function: _ZN15MenuBarInstance15ForEachWindowDoEhU13block_pointerFbP15OpaqueWindowPtrjE")
21: ("foreign function: _ZN15MenuBarInstance4HideE21MenuBarAnimationStylehhPhh")
22: ("foreign function: _ZN15MenuBarInstance21UpdateAggregateUIModeE21MenuBarAnimationStylehhh")
23: ("foreign function: _ZN15MenuBarInstance16ForEachMenuBarDoEU13block_pointerFvPS_E")
24: ("foreign function: _ZL25UpdateAllAggregateUIModes21MenuBarAnimationStyleh")
25: ("foreign function: SetSystemUIMode")
26: ("foreign function: -[NSApplication _setPresentationOptions:instance:flags:]")
27: ("foreign function: qt_plugin_instance")
28: ("foreign function: #x8B2BAB2")
29: ("foreign function: _ZN27QPlatformIntegrationFactory6createERK7QStringRK11QStringListRiPPcS2_")
30: ("foreign function: _ZN27QPlatformIntegrationFactory6createERK7QStringRK11QStringListRiPPcS2_")
31: ("foreign function: _ZN22QGuiApplicationPrivate25createPlatformIntegrationEv")
32: ("foreign function: _ZN22QGuiApplicationPrivate21createEventDispatcherEv")
33: ("foreign function: _ZN23QCoreApplicationPrivate4initEv")
34: ("foreign function: _ZN22QGuiApplicationPrivate4initEv")
35: ("foreign function: _ZN19QApplicationPrivate4initEv")
36: ("foreign function: _ZN13SharedLibraryC2Ev")
37: ("foreign function: initialize")
38: (CL-WEBENGINE::INITIALIZE)
39: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CL-WEBENGINE::INITIALIZE) #<NULL-LEXENV>)
40: (EVAL (CL-WEBENGINE::INITIALIZE))
41: (SWANK::EVAL-REGION "(cl-webengine::initialize) ..)
42: ((LAMBDA NIL :IN SWANK-REPL::REPL-EVAL))
43: (SWANK-REPL::TRACK-PACKAGE #<CLOSURE (LAMBDA NIL :IN SWANK-REPL::REPL-EVAL) {100318C0AB}>)
44: ((LAMBDA NIL :IN SWANK-REPL::REPL-EVAL))
45: (SWANK::CALL-WITH-RETRY-RESTART "Retry SLIME REPL evaluation request." #<CLOSURE (LAMBDA NIL :IN SWANK-REPL::REPL-EVAL) {100318C04B}>)
46: ((LAMBDA NIL :IN SWANK-REPL::REPL-EVAL))
47: (SWANK/BACKEND:CALL-WITH-SYNTAX-HOOKS #<CLOSURE (LAMBDA NIL :IN SWANK-REPL::REPL-EVAL) {100318C02B}>)
48: (SWANK::CALL-WITH-BUFFER-SYNTAX NIL #<CLOSURE (LAMBDA NIL :IN SWANK-REPL::REPL-EVAL) {100318C02B}>)
49: (SWANK-REPL::REPL-EVAL "(cl-webengine::initialize) ..)
50: (SWANK-REPL:LISTENER-EVAL "(cl-webengine::initialize) ..)
51: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK-REPL:LISTENER-EVAL "(cl-webengine::initialize) ..)
52: (EVAL (SWANK-REPL:LISTENER-EVAL "(cl-webengine::initialize) ..)
53: (SWANK:EVAL-FOR-EMACS (SWANK-REPL:LISTENER-EVAL "(cl-webengine::initialize) ..)
54: (SWANK::PROCESS-REQUESTS NIL)
55: ((LAMBDA NIL :IN SWANK::HANDLE-REQUESTS))
56: ((LAMBDA NIL :IN SWANK::HANDLE-REQUESTS))
57: (SWANK/SBCL::CALL-WITH-BREAK-HOOK #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (LAMBDA NIL :IN SWANK::HANDLE-REQUESTS) {1002E680FB}>)
58: ((FLET SWANK/BACKEND:CALL-WITH-DEBUGGER-HOOK :IN "/Users/jmercouris/.emacs.d/elpa/slime-20200228.1656/swank/sbcl.lisp") #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (LAMBDA NIL :IN SWANK::HANDLE-RE..
59: (SWANK/BACKEND:CALL-WITH-DEBUGGER-HOOK #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (LAMBDA NIL :IN SWANK::HANDLE-REQUESTS) {1002E680FB}>)
60: ((LAMBDA NIL :IN SWANK::HANDLE-REQUESTS))
61: (SWANK::CALL-WITH-BINDINGS ((*STANDARD-INPUT* . #<SWANK/GRAY::SLIME-INPUT-STREAM {1002E2F8E3}>)) #<CLOSURE (LAMBDA NIL :IN SWANK::HANDLE-REQUESTS) {1002E6811B}>)
62: ((FLET "FORM-FUN-5" :IN SWANK::HANDLE-REQUESTS))
63: (SWANK::HANDLE-REQUESTS #<SWANK::MULTITHREADED-CONNECTION {1002C0B143}> NIL)
64: (SWANK-REPL::REPL-LOOP #<SWANK::MULTITHREADED-CONNECTION {1002C0B143}>)
65: ((LAMBDA NIL :IN SWANK-REPL::SPAWN-REPL-THREAD))
66: (SWANK::CALL-WITH-BINDINGS NIL #<CLOSURE (LAMBDA NIL :IN SWANK-REPL::SPAWN-REPL-THREAD) {1002E680DB}>)
67: ((LAMBDA NIL :IN SWANK-REPL::SPAWN-REPL-THREAD))
68: ((FLET SB-UNIX::BODY :IN SB-THREAD::NEW-LISP-THREAD-TRAMPOLINE))
69: ((FLET "WITHOUT-INTERRUPTS-BODY-4" :IN SB-THREAD::NEW-LISP-THREAD-TRAMPOLINE))
70: ((FLET SB-THREAD::WITH-MUTEX-THUNK :IN SB-THREAD::NEW-LISP-THREAD-TRAMPOLINE))
71: ((FLET "WITHOUT-INTERRUPTS-BODY-1" :IN SB-THREAD::CALL-WITH-MUTEX))
72: (SB-THREAD::CALL-WITH-MUTEX #<CLOSURE (FLET SB-THREAD::WITH-MUTEX-THUNK :IN SB-THREAD::NEW-LISP-THREAD-TRAMPOLINE) {7A4DE7B}> #<SB-THREAD:MUTEX "thread result lock" owner: #<SB-THREAD:THREAD "repl-thr..
73: (SB-THREAD::NEW-LISP-THREAD-TRAMPOLINE #<SB-THREAD:THREAD "repl-thread" RUNNING {1002E605A3}> NIL #<CLOSURE (LAMBDA NIL :IN SWANK-REPL::SPAWN-REPL-THREAD) {1002E6054B}> NIL)
74: ("foreign function: call_into_lisp")
75: ("foreign function: new_thread_trampoline")
here is what my .pro file looks like:
TEMPLATE = lib
TARGET = webengine
INCLUDEPATH += .
QT += core gui widgets webenginewidgets
# Input
HEADERS += interface.h
SOURCES += interface.cpp
Upvotes: 2
Views: 381
Reputation: 348
I've figured out the answer, at least for my application, apparently I have to change the behavior of the code that interacts with my shared library:
(sb-int:with-float-traps-masked (:invalid :inexact :overflow) (cl-webengine::run))
in order to have a successful execution.
Upvotes: 1