cmake 安装pcl VTK Qt5 几个坑 (target_compile_features)

之前想要在ubuntu下进行点云的处理就按照网上的博客教程进行配置

https://blog.youkuaiyun.com/wanguku/article/details/60476469

这是我参考的教程,说的都挺对的。

但我遇到了几个坑,在这里为后人填几个

(不对的地方还望指出害羞)


1. Qt5从官网找不到linux版本的Qt5下载地址

反正我一直在Qt的官网上点get opensource 只能直接下载windows版本的exe安装包

后来我找到了这个Qt的镜像网址

http://download.qt.io/archive/

各个版本都有


还有一个就是我同学告诉了我清华源这个好网站

https://mirrors.tuna.tsinghua.edu.cn/#

大多数编程软件都可以找得到


2.Qt5的run文件运行问题

本来在正常的ubuntu主机上的图形界面运行run文件应该没有问题

但是我当时是在用windows的远程桌面连接(ubuntu 16.04服务器版本,桌面是用xrdp)服务器(通过xvnc协议)然后就会出现一个(unable initialize XRandr)的bug,run文件跑的时候那个框是透明的,无法继续安装。简单查了一下是因为远程连接的时候xvnc无法把XRandr初始化,这时候只能屁颠屁颠地跑去服务器直接装


3.cmake安装VTK

这是我遇到的最大的问题了,因为cmake还不是特别熟。按照上面提到的教程,在cmake时把各种Qt的相关位置设置好后依然出现了这个bug

如图(是的,服务器连的显示器分辨率

<think>我们讨论的是CMake中的`target_compile_features`命令。这个命令用于指定编译目标(可执行文件或库)时需要使用的编译器特性。它确保CMake在生成构建系统时,会为指定的目标启用所要求的编译器特性。如果编译器不支持某个特性,CMake会报错。###功能`target_compile_features`允许你指定目标所需的特定编译器特性。这些特性通常与C++标准相关(如cxx_std_11,cxx_std_14等),但也包括一些具体的语言特性(例如cxx_variadic_templates,cxx_lambdas等)。 ###用法基本语法:```cmaketarget_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature>[...])```- `<target>`:由`add_executable()`或`add_library()`创建的目标。- `PRIVATE`、`PUBLIC`、`INTERFACE`:指定特性的可见性。- `PRIVATE`:特性仅用于构建目标本身。-`PUBLIC`:特性用于构建目标本身以及依赖它的目标(包括链接目标)。- `INTERFACE`:特性仅用于依赖此目标的目标,而目标本身不使用。 -`<feature>...`:一个或多个特性名称。这些特性名称是CMake预定义的,用于表示特定的语言特性或标准。###常用特性1. **C++标准特性**:例如`cxx_std_11`、`cxx_std_14`、`cxx_std_17`、`cxx_std_20`等。使用这些特性可以要求编译器支持相应的C++标准。 2. **具体语言特性**:例如`cxx_auto_type`(C++11的auto)、`cxx_range_for`(基于范围的for循环)等。这些特性通常用于要求编译器支持某个具体的语言特性,而不需要指定整个标准。但通常推荐直接指定标准,除非有特殊需求。 ###示例假设我们有一个项目,其中包含一个可执行文件`my_app`,它依赖于一个库`my_lib`。我们希望`my_lib`使用C++14标准编译,而`my_app`使用C++17标准编译,并且`my_app`还使用了一些具体的特性(比如C++17的嵌套命名空间定义)。 ####示例代码```cmake#创建库add_library(my_libmy_lib.cpp)#要求my_lib使用C++14标准target_compile_features(my_libPUBLIC cxx_std_14)#创建可执行文件add_executable(my_appmain.cpp) #链接库target_link_libraries(my_app PRIVATE my_lib) #要求my_app使用C++17标准,并指定一个具体的特性(可选)target_compile_features(my_appPRIVATEcxx_std_17cxx_nested_namespaces)``` ###解释-对于`my_lib`,我们使用`PUBLIC`指定了`cxx_std_14`,这意味着任何链接`my_lib`的目标(如`my_app`)也会知道需要C++14标准。但是注意,`my_app`自己指定了C++17,所以最终`my_app`会使用C++17(因为更高标准会覆盖低标准,但具体行为取决于编译器)。-对于`my_app`,我们指定了`cxx_std_17`和`cxx_nested_namespaces`。`cxx_nested_namespaces`是C++17的一个具体特性(嵌套命名空间定义,例如`namespaceA::B`)。这里指定具体特性通常不是必须的,因为指定标准就会包含所有特性。但在某些情况下,你可能需要确保某个特性可用,即使你不想提升整个标准级别(比如你只想用这个特性,而其他代码仍用低标准)。###注意事项1.使用`target_compile_features`时,CMake会检查编译器是否支持指定的特性。如果不支持,会生成错误。 2.通常,推荐使用`cxx_std_*`特性来指定整个标准,而不是指定多个具体特性,因为这样更简单且不易出错。3.如果多个目标有依赖关系,并且指定了不同的标准,CMake会尝试为每个目标使用其指定的标准。但是,如果依赖的目标指定了更高的标准,那么当前目标可能会被提升(具体取决于编译器设置和CMake策略)。4.在较新版本的CMake(3.8及以上)中,还可以使用`target_compile_features`来指定C标准,例如`c_std_99`、`c_std_11`等。###相关命令-`set_target_properties`:可以设置目标的属性,包括`CXX_STANDARD`、`CXX_STANDARD_REQUIRED`等,这些属性也可以用来控制C++标准。但是`target_compile_features`更细粒度,可以指定具体的特性。- `cmake_minimum_required`:指定CMake的最低版本,因为`target_compile_features`在不同版本的CMake中支持的特性不同。 ###总结`target_compile_features`是一个强大的命令,用于精确控制目标所需的编译器特性。它有助于确保代码的可移植性,因为它会检查编译器是否支持所需的特性。§§相关问题§§: 1.如何在CMake中设置C++标准? 2. `target_compile_features`和设置`CMAKE_CXX_STANDARD`有什么区别? 3.如何查看我的编译器支持哪些特性?4.在CMake中如何为不同的目标设置不同的C++标准?</think>### `target_compile_features` 详细用法 `target_compile_features` 是 CMake 中用于指定目标(可执行文件/库)所需编译器特性的命令。它确保 CMake 检查编译器是否支持特定语言特性,并自动添加必要的编译标志(如 `-std=c++11`)。与全局设置(如 `set(CMAKE_CXX_STANDARD 11)`)不同,它提供更精细的按目标控制。 --- #### **基本语法** ```cmake target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [<feature>...] ) ``` - **`<target>`**:由 `add_executable()` 或 `add_library()` 创建的目标名称。 - **可见性**: - `PRIVATE`:仅用于构建当前目标。 - `PUBLIC`:用于当前目标及依赖它的目标。 - `INTERFACE`:仅用于依赖当前目标的目标。 - **`<feature>`**:预定义的特性名称(如 `cxx_std_11`)。 --- #### **常用特性列表** | 特性名 | 描述 | |---------------------|-------------------------------| | `cxx_std_11` | 要求 C++11 支持 | | `cxx_std_14` | 要求 C++14 支持 | | `cxx_std_17` | 要求 C++17 支持 | | `cxx_auto_type` | C++11 的 `auto` 关键字 | | `cxx_lambda` | C++11 的 Lambda 表达式 | | `cxx_range_for` | C++11 的范围 `for` 循环 | > 完整特性列表见 [CMake 官方文档](https://cmake.org/cmake/help/latest/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html)。 --- #### **示例代码** ##### 1. 为单个目标指定 C++14 标准 ```cmake cmake_minimum_required(VERSION 3.8) project(Example) add_executable(my_app main.cpp) # 要求 my_app 使用 C++14 target_compile_features(my_app PRIVATE cxx_std_14) ``` ##### 2. 库目标传递特性给依赖者 ```cmake add_library(my_lib my_lib.cpp) # PUBLIC 表示依赖 my_lib 的目标也需 C++17 target_compile_features(my_lib PUBLIC cxx_std_17) add_executable(app main.cpp) target_link_libraries(app PRIVATE my_lib) # app 自动继承 C++17 要求 ``` ##### 3. 检查具体语言特性 ```cmake add_executable(modern_app main.cpp) # 显式要求编译支持 Lambda 和 range-for target_compile_features(modern_app PRIVATE cxx_lambda cxx_range_for ) ``` --- #### **关键说明** 1. **自动标志处理**: CMake 会根据特性自动添加 `-std=c++11` 等标志,无需手动设置。 2. **编译器兼容性检查**: 如果编译器不支持指定特性,CMake 会报错,避免运行时错误。 3. **优先级**: 比全局 `CMAKE_CXX_STANDARD` 优先级更高,允许不同目标使用不同标准。 4. **版本要求**: 需要 CMake ≥ 3.8(部分特性需 ≥ 3.15)。 --- #### **对比全局设置** | 方法 | 作用范围 | 灵活性 | |-----------------------------|---------------|------------| | `target_compile_features` | 单个目标 | ✅ 精细控制 | | `set(CMAKE_CXX_STANDARD 11)` | 所有目标 | ❌ 全局统一 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值