考虑一下:
- 将 Python 嵌入的到 C++ 中,编译出一个可执行程序
- 并将 Python 的文件(.py, .so, .pyd,等)放到可执行程序所在目录的某个子目录
那么,嵌入的Python如何找到这些文件呢?
需要知道可执行程序自身路径,可是,C、C++ 标准库没有提供这种东西
只能使用系统api了,而系统api用起来需要注意的问题似乎总是不少,
不过呢,Qt 中提供的这种功能,我们不妨看看它是如何做的:
Qt Manual
QString QCoreApplication::applicationFilePath () [static]
Returns the file path of the application executable.
For example, if you have installed Qt in the /usr/local/qt directory, and you run the regexp example, this function will return "/usr/local/qt/examples/tools/regexp/regexp".
Warning: On Linux, this function will try to get the path from the /proc file system. If that fails, it assumes that argv[0] contains the absolute file name of the executable. The function also assumes that the current directory has not been changed by the application.
恩,这儿已经介绍了 Linux 下是如何实现的了,不过还是看看源码吧,毕竟,
在离开Qt的C++下,需要我们自己写类似的代码。
Unix/Linux
源码如下:
#if defined( Q_OS_UNIX )
# ifdef Q_OS_LINUX
// Try looking for a /proc/<pid>/exe symlink first which points to
// the absolute path of the executable
QFileInfo pfi(QString::fromLatin1("/proc/%1/exe").arg(getpid()));
if (pfi.exists() && pfi.isSymLink()) {
d->cachedApplicationFilePath = pfi.canonicalFilePath();
return d->cachedApplicationFilePath;
}
# endif
QString argv0 = QFile::decodeName(QByteArray(argv()[0]));
QString absPath;
if (!argv0.isEmpty() && argv0.at(0) == QLatin1Char('/')) {
/*
If argv0 starts with a slash, it is already an absolute
file path.
*/
absPath = argv0;
} else if (argv0.contains(QLatin1Char('/'))) {
/*
If argv0 contains one or more slashes, it is a file path
relative to the current directory.
*/
absPath = QDir::current().absoluteFilePath(argv0);
} else {
/*
Otherwise, the file path has to be determined using the
PATH environment variable.
*/
QByteArray pEnv = qgetenv("PATH");
QDir currentDir = QDir::current();
QStringList paths = QString::fromLocal8Bit(pEnv.constData()).split(QLatin1Char(':'));
for (QStringList::const_iterator p = paths.constBegin(); p != paths.constEnd(); ++p) {
if ((*p).isEmpty())
continue;
QString candidate = currentDir.absoluteFilePath(*p + QLatin1Char('/') + argv0);
QFileInfo candidate_fi(candidate);
if (candidate_fi.exists() &&
Windows
Windows 提供了 GetModuleFileName 这种函数,所以操作就容易多了,不过Qt源码中也还是一大段哈。
- 首先,假定路径总长度不超过 MAX_PATH(当前情况下,其值仍然是260,似乎微软也没有动它的打算?)
- 在 栈 上分配一个 MAX_PATH + 2 长度的数组
- 如果真实的长度超过了 MAX_PATH,就改用在 堆 中分配内存
- 分配 2倍MAX_PATH,进行尝试
- 依然不行,则分配 3倍 MAX_PATH,
- ...
// We do MAX_PATH + 2 here, and request with MAX_PATH + 1, so we can handle all paths
// up to, and including MAX_PATH size perfectly fine with string termination, as well
// as easily detect if the file path is indeed larger than MAX_PATH, in which case we
// need to use the heap instead. This is a work-around, since contrary to what the
// MSDN documentation states, GetModuleFileName sometimes doesn't set the
// ERROR_INSUFFICIENT_BUFFER error number, and we thus cannot rely on this value if
// GetModuleFileName(0, buffer, MAX_PATH) == MAX_PATH.
// GetModuleFileName(0, buffer, MAX_PATH + 1) == MAX_PATH just means we hit the normal
// file path limit, and we handle it normally, if the result is MAX_PATH + 1, we use
// heap (even if the result _might_ be exactly MAX_PATH + 1, but that's ok).
wchar_t buffer[MAX_PATH + 2];
DWORD v = GetModuleFileName(0, buffer, MAX_PATH + 1);
buffer[MAX_PATH + 1] = 0;
if (v == 0)
return QString();
else if (v <= MAX_PATH)
return QString::fromWCharArray(buffer);
// MAX_PATH sized buffer wasn't large enough to contain the full path, use heap
wchar_t *b = 0;
int i = 1;
size_t size;
do {
++i;
size = MAX_PATH * i;
b = reinterpret_cast<wchar_t *>(realloc(b, (size + 1) * sizeof(wchar_t)));
if (b)
v = GetModuleFileName(NULL, b, size);
} while (b && v == size);
if (b)
*(b + size) = 0;
QString res = QString::fromWCharArray(b);
free(b);
分享到:
相关推荐
QT C++实现Dijkstra最短路径算法的工程源码提供了在图形用户界面(GUI)下解决图论问题的一个实例。这个项目结合了QT框架的强大功能和C++编程语言的灵活性,帮助开发者直观地理解和应用Dijkstra算法。以下是相关知识点...
基于Qt和C++实现的故宫游览路径规划程序源码.zip基于Qt和C++实现的故宫游览路径规划程序源码.zip基于Qt和C++实现的故宫游览路径规划程序源码.zip基于Qt和C++实现的故宫游览路径规划程序源码.zip基于Qt和C++实现的...
**C++版本Qt MQTT源码解析** 在C++开发中,Qt是一个广泛应用的跨平台框架,它提供了丰富的GUI工具和网络编程支持。而MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅协议,常用于物联网(IoT)...
基于C_C++ Qt5开发跨平台桌面程序网络调试应用源码+项目说明.zip 【项目介绍】 基于C/C++ Qt5开发跨平台桌面程序应用,使用TCP/IP、UDP/IP网络协议,B/S、C/S架构,实现上下位机、客户端与服务器之间网络通信调试。 ...
C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip 基于Qt实现的简单绘画板程序。 ## 功能介绍 - 绘制点、直线、椭圆、矩形等基本几何图形; - 存储、读取绘图文件; - 撤回、重做等功能; - 调节线宽、线条...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计...基于C++、QT的电子地图系统导航源码+项目说明(通过解析OSM文件来获得真实地图数据).zip
在Linux环境下编译Qt源码是一项复杂而重要的任务,尤其对于开发者来说,它涉及到C++编程语言、Qt库以及对操作系统内核的理解。Qt是一个跨平台的开发框架,广泛用于创建图形用户界面(GUI)应用,支持Windows、Linux...
《Qt5.9 C++开发指南》是一本深入讲解使用Qt 5.9框架进行C++应用程序开发的专业书籍。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式系统。这本书的配套代码提供了丰富的实例,帮助读者更好地理解...
基于C++和Qt5实现的粮仓监测系统的上位机项目源码(支持实时的串口数据波形显示,数据库,json加载保存配置).zip 【说明】 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程...
C++程序开发基于Qt实现的简单绘画板程序源码+项目说明(课程大作业) 功能介绍 绘制点、直线、椭圆、矩形等基本几何图形; 存储、读取绘图文件; 撤回、重做等功能; 调节线宽、线条颜色; 显示鼠标坐标位置。 注意...
基于Qt6.2.3和C++实现的的coinfip游戏源码.zip基于Qt6.2.3和C++实现的的coinfip游戏源码.zip基于Qt6.2.3和C++实现的的coinfip游戏源码.zip基于Qt6.2.3和C++实现的的coinfip游戏源码.zip基于Qt6.2.3和C++实现的的...
【Qt/C++ VLC播放器DEMO源码】是一款基于Qt框架和VLC库开发的开源播放器项目。这个项目展示了如何在C++编程环境中利用Qt的图形用户界面(GUI)功能与VLC多媒体播放器的强大功能相结合,创建一个功能丰富的视频播放...
- **Git**:用于克隆QT源码库。你可以从Git官网下载并安装最新版。 - **CMake**:QT6的构建系统基于CMake,所以你需要安装CMake 3.10或更高版本。 - **Python**:编译过程需要Python,通常QT会要求Python 3.6或更...
【标题】基于C++&Qt框架的分布式智能AGV调度系统 这个项目是利用C++编程语言和Qt框架开发的一款分布式智能自动引导车(AGV)调度系统。C++是面向对象的编程语言,以其高效性和灵活性在系统级编程、游戏引擎以及复杂...
Qt是一个强大的跨平台应用程序开发框架,广泛用于创建桌面、移动以及嵌入式系统的用户界面。提供的十套自定义控件源码可以帮助初学者更好地理解和实践Qt自定义控件的开发。 1. **wavedata**: 这个示例可能涉及到了...
**C++ GUI Qt4编程** 是一本专注于使用Qt4库进行图形用户界面(GUI)开发的书籍,适合C++程序员深入学习如何利用Qt框架构建高效、功能丰富的应用程序。Qt4是一个跨平台的应用程序开发框架,支持Windows、Linux、Mac ...
这个"Qt编写移除C++代码注释源码"项目提供了一个用Qt5实现的解决方案,它可以帮助我们快速地自动化这个过程。 Qt是一个跨平台的应用程序开发框架,主要用于C++编程,同时也支持QML。Qt5是其最新版本,引入了许多新...
在本文中,我们将深入探讨QGIS的最新源码,以及与C++、QT和Linux相关的开发知识。 首先,QGIS的核心是用C++编程语言编写的,这是一种强大的、静态类型的系统级编程语言,常用于开发高性能的应用程序。C++以其面向...
#### 011 qt项目由源码和界面资源文件到程序的步骤分析 - **资源管理**:使用.qrc文件来管理项目中的资源文件。 - **编译过程**:从源代码到最终可执行文件的整个编译链路,包括预处理、编译、链接等步骤。 #### ...
基于Qt+C++开发的室外基于GPS的无人机分布式编队避障飞行项目源码+开发文档说明+实验数据报告,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Qt+C++开发的...