尝试这样做是不切实际的。这在理论上是可能的,但您需要为大量内容创建 C 包装器。
您可以尝试将应用程序的 GUI 部分拆分为它自己的共享库和 dlopen() 。例如,gui.cpp:
// Needs to be extern "C" so that dlopen() can find it later.
extern "C"
int runGui(int argc, char *argv[])
{
QApplication a(argc, argv);
client w;
w.show();
doStuff();
return a.exec();
}
您将上述内容编译为共享库,链接到 QtGui。例如:
g++ -c -fPIC $(pkg-config QtGui --cflags) -o gui.o gui.cpp
g++ -shared -o gui.so gui.o $(pkg-config QtGui --libs)
这将为您提供gui.so
dlopen() ,然后您可以在主程序中使用它:
#include <dlfcn.h>
int main(int argc, char *argv[])
{
// SOME COMMON CODE will be executed before this
bool myGUI = getenv("DISPLAY") != 0;
int ret = 0;
if (myGUI) {
void* handle = dlopen("./gui.so", RTLD_NOW);
if (!handle) {
// Error: dlopen failed
}
dlerror(); // Clear/reset errors.
// Create a function pointer type for runGui()
typedef int (*runGui_t)(int, char**);
// Load the address of runGui() and store it in a
// function pointer. The function pointer name doesn't
// have to be the same as the function we're loading.
runGui_t runGui = (runGui_t)dlsym(handle, "runGui");
const char* dlsym_error = dlerror();
if (dlsym_error) {
// Error: dlsym failed.
// 'dlsym_error' contains the error msg.
}
// Call the function as usual by using our 'runGui' pointer.
ret = runGui(argc, argv);
dlclose(handle);
} else {
QCoreApplication a(argc, argv);
doStuff();
ret = a.exec();
}
return ret;
}
请注意,在构建上述 main.cpp 时,您不能链接到 QtGui,以便它将在 libQtGui.so 不可用的系统上运行。在这种情况下,dlopen() 将无法加载 gui.so。此时,您可以回退到非 GUI 代码(在上面的示例中我没有这样做。)