Ubuntu QT 转 Windows Qt 5.13.0+VS MSVC 2017

在将Ubuntu上的Qt 5.13.0项目迁移到Windows并使用Visual Studio 2017时遇到了两个主要问题:动态库链接错误和界面显示乱码。动态库链接时只生成了.dll文件,缺少.lib文件,解决方法是确保.dll与.exe在同一目录下。界面显示乱码则涉及文件编码和代码设置,通过删除并重建文件及调整代码解决了乱码问题。

1. 动态库链接出错

生成动态库时,用MSVC2017_x64编译只生成dll文件,而没有lib文件

#define __DLL_EXPORTS__
#ifdef __DLL_EXPORTS__
#define DLLAPI  __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif
class DLLAPI A{
   
       
<think>我们已知用户的需求是在VS2017Qt5.9.8环境下实现将txt文件换为las文件。 根据引用内容,我们可以得知: 引用[1]介绍了在VS2017中安装Qt Visual Studio Tools的方法。 引用[2]提到了使用VS2017+Qt5.9编译CloudCompare的例子,而CloudCompare是一个处理点云(包括las格式)的开源软件。 引用[3]介绍了在Ubuntu下安装Qt5.9.8并配置环境变量的方法,但我们的环境是Windows,所以安装步骤会有所不同。 思路: 1. 首先,我们需要配置开发环境:VS2017Qt5.9.8。由于引用[1]已经介绍了如何在VS2017中安装Qt插件,我们可以按照这个步骤进行。 2. 其次,我们要处理的是txtlas,这涉及到点云数据的处理。LAS格式是一种常见的点云数据格式,通常用于激光雷达数据。 3. 我们可以考虑使用已有的库来处理LAS文件。常用的库有LASlib(LAStools的一部分)和PDAL(点云数据抽象库)。但是,由于用户使用的是Qt,我们可能更倾向于使用可以在Qt项目中集成的库。 4. 另外,CloudCompare(引用[2]中提到的)本身支持多种点云格式,包括txt和las,并且它是开源的。我们可以考虑直接使用CloudCompare的代码库中的相关功能,或者参考其实现。 然而,用户希望自己实现在VS2017Qt5.9.8环境下的换工具,而不是使用CloudCompare。因此,我们有两种选择: a) 使用现有的库(如LASlib)来读写LAS文件,然后自己解析txt文件,将数据填充到LAS文件中。 b) 参考CloudCompare中关于读写las和txt的代码部分,提取出换功能。 考虑到CloudCompare的复杂性,以及用户可能希望一个简单的方法,我们这里选择使用LASlib库,因为它专门用于LAS文件的读写。 步骤: 1. 下载并编译LASlib库(注意:LASlib是LAStools的一部分,但LAStools的许可需要注意,如果是非商业用途,可以免费使用,商业用途需要购买许可)。 2.VS2017中配置Qt5.9.8项目,并引入LASlib库。 3. 编写代码:读取txt文件(需要知道txt文件的格式,例如每行是x,y,z还是包含其他属性),然后创建LAS文件并写入点。 具体实现: - 假设txt文件每行包含点的坐标,可能还有强度、颜色等信息,且以空格或逗号分隔。 - 我们需要定义LAS文件的点格式(例如,是否包含RGB,是否包含强度等),然后根据txt文件中的信息来设置点的属性。 由于引用中没有直接给出txtlas的代码,我们将根据上述思路来给出实现步骤。 实现步骤: 1. 环境准备: - 安装VS2017,并安装Qt Visual Studio Tools(参考引用[1])。 - 下载Qt5.9.8并安装(Windows版本)。然后在VS2017中配置Qt版本(通过Qt VS Tools的选项设置Qt路径)。 2. 下载LASlib库(例如,从https://github.com/LAStools/LAStools 获取,注意选择适当的版本)。 - 编译LASlib:使用VS2017打开LASlib的解决方案(可能需要CMake生成或者直接提供VS解决方案),编译生成静态库(如las.lib)。 3.Qt项目中配置LASlib: - 将LASlib的头文件路径添加到项目的包含目录中。 - 将las.lib添加到项目的附加依赖项。 - 将LASlib的dll文件(如las.dll)放在可执行文件目录下,或者将las.lib设置为静态链接。 4. 编写代码: - 读取txt文件,逐行解析。 - 使用LASlib创建LAS文件,设置LAS头信息(如点格式、坐标范围等)。 - 将解析出的点数据写入LAS文件。 代码示例(核心部分): ```cpp #include <laswriter.hpp> #include <fstream> #include <sstream> #include <string> bool txtToLas(const std::string& txtFile, const std::string& lasFile) { // 打开txt文件 std::ifstream in(txtFile); if (!in) { return false; } // 创建LAS写入器 LASwriteOpener lasWriteOpener; lasWriteOpener.set_file_name(lasFile.c_str()); LASheader lasHeader; // 设置LAS头信息,根据实际情况调整 lasHeader.x_scale_factor = 0.01; lasHeader.y_scale_factor = 0.01; lasHeader.z_scale_factor = 0.01; lasHeader.x_offset = 0.0; lasHeader.y_offset = 0.0; lasHeader.z_offset = 0.0; lasHeader.point_data_format = 1; // 例如,格式1包含GPS时间 lasHeader.point_data_record_length = 28; LASpoint lasPoint; lasPoint.init(&lasHeader, lasHeader.point_data_format, lasHeader.point_data_record_length, 0); LASwriter* lasWriter = lasWriteOpener.open(&lasHeader); if (!lasWriter) { return false; } std::string line; while (std::getline(in, line)) { std::istringstream iss(line); double x, y, z; // 假设每行是x y z,用空格分隔 if (!(iss >> x >> y >> z)) { continue; // 解析错误,跳过 } // 设置点坐标 lasPoint.set_x(x); lasPoint.set_y(y); lasPoint.set_z(z); // 可以设置其他属性,如强度、颜色等,如果有的话 // lasPoint.set_intensity(intensity); // 写入点 lasWriter->write_point(&lasPoint); lasWriter->update_inventory(&lasPoint); } // 更新头信息(例如点的数量)并关闭写入 lasHeader.point_records_count = lasWriter->p_count; lasWriter->update_header(&lasHeader, TRUE); lasWriter->close(); delete lasWriter; return true; } ``` 注意:以上代码是示例,实际使用需要根据txt文件的具体格式进行调整,并且需要处理LAS头信息中的必要字段(如坐标范围、点格式等)。 5.Qt项目中,我们可以将这个换函数放在一个类中,并通过Qt的界面(如果需要)来调用。 另外,如果用户不需要界面,也可以编写控制台程序。 注意事项: - LASlib的许可:确保符合使用要求(LAStools的许可对于非商业用途是免费的,但商业用途需要购买)。 - 如果txt文件包含更多信息(如RGB、强度等),需要在解析时读取并设置到LAS点中。 - LAS文件有不同的点格式(0-10),需要根据实际数据选择合适的格式。 如果用户希望避免许可问题,可以考虑使用其他开源库,如PDAL(点云数据抽象库)。但PDAL的使用可能更复杂,且需要额外的依赖。这里考虑到用户环境是VS2017Qt5.9.8,我们选择了LASlib,因为它在Windows下相对容易集成。 因此,总结实现步骤如下: 1. 配置VS2017Qt5.9.8环境(安装Qt VS Tools,安装Qt5.9.8)。 2. 下载并编译LASlib,得到静态库(las.lib)和头文件。 3.VS2017中创建Qt项目(可以是控制台或GUI程序),配置LASlib库。 4. 编写换函数,如上示例。 5. 编译并测试。 相关问题: §§相关问题§§ 1. 如何配置VS2017Qt5.9.8的开发环境? 2. 如何编译LASlib库? 3. LAS文件的格式是什么?有哪些不同的点格式? 4. 如何解析包含额外属性(如RGB、强度)的txt文件? 5. 除了LASlib,还有哪些库可以读写LAS文件? </think>### VS2017Qt5.9.8环境下实现TXTLAS文件的方法 在VS2017Qt5.9.8环境下实现TXTLAS文件,需要结合LAS文件格式规范和Qt的文件处理功能。以下是具体实现步骤: --- ### 1. **环境配置** - **安装Qt VS Tools** 按引用[1]方法:VS2017 → 工具 → 拓展与更新 → 联机 → 搜索安装 `Qt Visual Studio Tools` → 重启VS[^1]。 - **配置Qt路径** 安装Qt5.9.8后,在VS中:Qt VS Tools → Qt Options → 添加路径(如`C:\Qt\5.9.8\msvc2017_64`)。 --- ### 2. **创建Qt项目** - 新建Qt控制台应用程序(或GUI应用) - 配置`.pro`文件添加依赖: ```qmake QT += core CONFIG += c++11 ``` --- ### 3. **实现TXTLAS核心逻辑** #### (1) **LAS文件结构** LAS文件包含: - **公共头**(固定227字节):文件签名、版本、点数据格式等 - **变长记录**(可选):坐标系、元数据等 - **点数据记录**:坐标、强度、回波信息等 #### (2) **TXT解析(示例格式)** 假设TXT每行包含: ``` X Y Z Intensity ReturnNumber NumberOfReturns ``` 例如: ``` 637012.00 4833519.00 112.00 150 1 3 ``` #### (3) **代码示例** ```cpp #include <QFile> #include <QTextStream> #include <fstream> #include <vector> #pragma pack(push, 1) struct LasPoint { int x; // 缩放后的X坐标 int y; // 缩放后的Y坐标 int z; // 缩放后的Z坐标 quint16 intensity; // 强度值 quint8 return_number : 3; // 回波编号 quint8 number_of_returns : 3; // 总回波数 // 其他字段根据需求扩展... }; #pragma pack(pop) bool convertTxtToLas(const QString& txtPath, const QString& lasPath) { // 1. 读取TXT文件 QFile txtFile(txtPath); if (!txtFile.open(QIODevice::ReadOnly | QIODevice::Text)) return false; std::vector<LasPoint> points; QTextStream in(&txtFile); while (!in.atEnd()) { QStringList coords = in.readLine().split(" "); if (coords.size() < 6) continue; LasPoint pt; double x = coords[0].toDouble(); double y = coords[1].toDouble(); double z = coords[2].toDouble(); // 缩放坐标(示例:厘米精度) pt.x = static_cast<int>(x * 100); pt.y = static_cast<int>(y * 100); pt.z = static_cast<int>(z * 100); pt.intensity = static_cast<quint16>(coords[3].toInt()); pt.return_number = coords[4].toInt() & 0x07; pt.number_of_returns = coords[5].toInt() & 0x07; points.push_back(pt); } txtFile.close(); // 2. 写入LAS文件 std::ofstream lasFile(lasPath.toStdString(), std::ios::binary); if (!lasFile) return false; // 公共头(简化版) char header[227] = {0}; memcpy(header, "LASF", 4); // 文件签名 header[24] = 1; // 格式版本 header[25] = 2; header[104] = 1; // 点数据格式1 *reinterpret_cast<quint32*>(header + 107) = points.size(); // 点数 // 坐标系等元数据需按需填充 lasFile.write(header, 227); lasFile.write(reinterpret_cast<char*>(points.data()), points.size() * sizeof(LasPoint)); lasFile.close(); return true; } // 在main.cpp中调用 int main(int argc, char *argv[]) { convertTxtToLas("input.txt", "output.las"); return 0; } ``` --- ### 4. **编译注意事项** 1. **字节对齐** 使用 `#pragma pack(1)` 确保点数据无填充字节。 2. **坐标缩放** LAS存储整数坐标:实际值 = 缩放值 × scale + offset(需在头中定义)。 3. **格式兼容** 完整实现需支持不同点格式(0-10),参考[LAS规范](https://www.asprs.org/divisions-committees/lidar-division/laser-las-file-format-exchange-activities)。 --- ### 5. **扩展优化建议** - **添加元数据**:在变长记录中存储坐标系(如EPSG:4326) - **批量处理**:大文件时使用分块读写 - **错误处理**:检查坐标范围有效性 - **使用专业库**:集成[PDAL](https://pdal.io/)或[LASlib](https://github.com/LAStools/LAStools)简化开发 > 关键参考:CloudCompare的源码实现了完整的LAS读写(引用[2]),可参考其`LASIO`模块[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值