【发布时间】:2020-06-23 12:02:20
【问题描述】:
我有一个程序的最小示例。它在编译为应用程序时起作用,但作为共享库失败。为什么是这样?
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;
}
当我将我的应用程序编译为应用程序并运行 main 时,它工作得很好。当我将我的应用程序编译为 lib 并运行 initialize 时,它会崩溃。有趣的是,同样的代码也适用于 Linux。下面的完整堆栈跟踪:
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")
这是我的 .pro 文件的样子:
TEMPLATE = lib
TARGET = webengine
INCLUDEPATH += .
QT += core gui widgets webenginewidgets
# Input
HEADERS += interface.h
SOURCES += interface.cpp
【问题讨论】:
-
不确定这是否是唯一的问题,但是...
QApplication的文档非常清楚地说明了"Warning: The data referred to by argc and argv must stay valid for the entire lifetime of the QApplication object. In addition, argc must be greater than zero and argv must contain at least one valid character string."。 -
我会继续添加一个参数,看看是否有影响,谢谢。
-
@G.M.我进行了编辑,但行为没有明显变化
-
@jmercouris:你是如何编译你的代码的?
-
我正在像这样编译我的代码:
qmakemake cleanmake然后我将共享库在我的情况下 *.dylib 复制到/opt/local/lib。