C++学习(二三五)qt android undefined reference to `OpenThreads::Mutex::~Mutex()‘

本文解析了在Android应用开发中连接过程中的常见错误,重点在于库参数的正确排列顺序,特别是静态库的编译顺序,它遵循从基础库到高级库的原则。

这类错误是在连接过程中出现的

原因:连接库参数的顺序不对 ,在默认情况下,对于-l 使用库的要求是越是基础的库越要写在后面,无论是静态还动态,在生成android应用时有此顺序,生成window程序时无此顺序

 

 

 

#include "mainwindow.h" #include <QApplication> #include <windows.h> #include <wtsapi32.h> #pragma comment(lib, "Wtsapi32.lib") int main(int argc, char *argv[]) { QApplication a(argc, argv); HANDLE hToken = NULL; DWORD dwSessionId = WTSGetActiveConsoleSessionId(); if (!WTSQueryUserToken(dwSessionId, &hToken)) { QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("获取用户令牌失败!")); return -1; } HANDLE mutex = ::CreateMutex(Q_NULLPTR, true, (LPCWSTR)qApp->applicationName().toStdWString().c_str()); if (GetLastError() == ERROR_ALREADY_EXISTS) { QMessageBox warningBox(QMessageBox::Warning, QStringLiteral("警告"), QStringLiteral("程序[文本数据同步服务端]只能运行一个!")); warningBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定")); warningBox.setStandardButtons(QMessageBox::Ok); warningBox.exec(); ::CloseHandle(mutex); return 0; } else { ::ReleaseMutex(mutex); } STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.lpDesktop = (LPWSTR)L"winsta0\\default"; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); if (!CreateProcessAsUser(hToken, NULL, (LPWSTR)qApp->applicationFilePath().toStdWString().data(), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { QMessageBox::warning(nullptr, QStringLiteral("错误"), QStringLiteral("创建进程失败!")); CloseHandle(hToken); return -1; } CloseHandle(hToken); MainWindow w; w.show(); return a.exec(); } 以上QT C++代码会报出以下错误: D:\QtProject\DataServer\main.cpp:-1: error: undefined reference to `WTSQueryUserToken@8' collect2.exe:-1: error: error: ld returned 1 exit status 请修复后给我完整代码
05-30
`undefined reference to 'pthread_mutex_consistent_np'` 错误通常是由于链接器在链接程序时找不到 `pthread_mutex_consistent_np` 函数的实现库。`pthread_mutex_consistent_np` 是 POSIX 线程库(pthread)中的一个函数,该错误一般是因为编译时没有正确链接 pthread 库导致的。以下是几种常见的解决方法: ### GCC 或 Clang 编译器 在使用 GCC 或 Clang 编译 C 或 C++ 程序时,需要在编译命令中添加 `-lpthread` 选项来链接 pthread 库。例如,对于一个名为 `main.c` 的 C 文件,可以使用以下命令进行编译: ```bash gcc -o main main.c -lpthread ``` 对于 C++ 文件(例如 `main.cpp`),可以使用以下命令: ```bash g++ -o main main.cpp -lpthread ``` ### CMake 项目 如果是使用 CMake 来管理项目,需要在 `CMakeLists.txt` 文件中添加对 pthread 库的链接。示例如下: ```cmake cmake_minimum_required(VERSION 3.10) project(YourProjectName) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) # 添加可执行文件 add_executable(YourExecutableName main.cpp) # 查找 pthread 库 find_package(Threads REQUIRED) # 链接 pthread 库 target_link_libraries(YourExecutableName PRIVATE Threads::Threads) ``` 在上述示例中,`find_package(Threads REQUIRED)` 用于查找系统中的线程库,`target_link_libraries` 用于将找到的线程库链接到可执行文件中。 ### 检查系统 pthread 库 确保系统中已经安装了 pthread 库。在大多数 Linux 发行版中,pthread 库通常是默认安装的。如果没有安装,可以使用包管理器进行安装。例如,在 Ubuntu 或 Debian 系统中,可以使用以下命令安装: ```bash sudo apt-get install libpthread-stubs0-dev ``` 在 CentOS 或 Fedora 系统中,可以使用以下命令安装: ```bash sudo yum install glibc-devel ``` ### 检查函数兼容性 `pthread_mutex_consistent_np` 中的 `_np` 表示该函数是非标准(non-portable)的,可能在某些系统中不可用。确保你的系统支持该函数,或者考虑使用标准的替代函数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值