cmake CMakeLists.txt 命令 add_compile_options、add_definitions、target_compile_definitions、build_command

add_compile_options()

增加源文件的编译选项。

add_compile_options(<option> ...)

为当前路径和下层路径的目标增加编译器命令行选项,选项在此命令被调用后添加。查看文档中关于路径和目标的 COMPILE_OPTIONS 属性。

这个命令可以被用来添加任何的选项,但是存在替代命令(target_compile_definitions() 和 add_definitions())增加预处理定义或(target_include_directories() 和 include_directories())包含路径。

add_compile_options的参数可以使用带语法$<...>的“生成表达式”。关于有效的表达式可以查看cmake-generator-expressions(7)手册。关于更多的系统属性的定义可以查看cmake-buildsystem(7)助手。

 

add_definitions()

为源文件的编译添加由-D定义的标志。

add_definitions(-DFOO -DBAR ...)

为当前路径以及下层路径的目标加入编译器命令行定义(定义在命令调用之前或之后被添加,注:也就是不确定)。这个命令可以用来添加任何标志,但是它的原意是用来增加预处理器的定义(查看 add_compile_options() 命令增加其它的定义)。那些以 -D 或 /D 开头的标志,看起来像预处理器定义的flag,会被自动加到当前路径的 COMPILE_DEFINITIONS 属性中。为了后向兼容,非简单值(non-trival,指的是什么?——译注)的定义会被留在flags组(flags set)里,而不会被转换。关于在特定的域以及配置中增加预处理器的定义,参考路径、目标以及源文件的 COMPILE_DEFINITIONS 属性来获取更多的细节。

 

target_compile_definitions()

为目标增加编译定义。

target_compile_definitions(<target>
                           <INTERFACE|PUBLIC|PRIVATE> [items1...]
                           [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]
                          )

编译给定的 <target> 时使用指定的编译定义。<target> 必须是 add_executable() 或者 add_library() 创建的,并且不是一个输入目标。

关键字INTERFACE,PUBLIC和PRIVATE用来指定其后参数的作用域。PRIVATE 和 PUBLIC 项将产生 <target> 的 COMPILE_DEFINITIONS 属性。PUBLIC 和 INTERFACE 项将产生 <target> 的INTERFACE_COMPILE_DEFINITIONS 属性。其后的参数指定编译定义。重复调用相同的目标将按照调用顺序追加(定义)。

target_compile_definitions的参数可以使用带语法$<...>的“生成表达式”。

 

build_command()

获取构建该工程的命令行。通常是供CTest模块的内部使用。

注:笔者给出了一个简单的例子在文档结尾。

build_command(<variable>
              [CONFIGURATION <config>]
              [TARGET <target>]
              [PROJECT_NAME <projname&gt] # legacy, causes warning
             )

实例

cmake_minimum_required(VERSION 2.8)
project(cmaketest)
#set(CMAKE_CXX_COMPILER "g++")
add_compile_options(-std=c++11 -w)
#add_definitions(-std=c++11)

build_command(BUILD_COMMAND_LINE CONFIGURATION ${CMAKE_BUILD_TYPE}
PROJECT_NAME cmaketest TARGET all)

message("build command:${BUILD_COMMAND_LINE}")

message("using compiler ${CMAKE_CXX_COMPILER}")

add_executable(test main.cpp)

build command:/usr/bin/make -i "all"

using compiler /usr/bin/c++

// main.cpp

int main(int argc, char *argv[])
{
    int n = 5.5f;
    auto func = [&](int n) {return n < 5;};
    return 0;
}

 

 

### 回答1: 这个错误意味着CMake无法为名为“main”的生成目标指定编译定义,因为该目标似乎没有被正确地生成。可能是CMakeLists.txt文件中有某些问题导致生成目标不正确,或者在使用CMake时出现了其他问题。需要检查CMakeLists.txt文件并确保它正确地定义了生成目标。 ### 回答2: CMakeLists.txt处的CMake错误:110(target_compile_definitions)是由于在CMakeLists.txt文件中,尝试为未被生成的目标“main”指定编译定义而导致的。 这个问题可能是由于以下几个原因引起的: 1. 项目中没有名为“main”的目标:这可能是因为在CMakeLists.txt中没有正确定义或编译目标“main”。要解决此问题,需要确保在CMakeLists.txt文件中正确定义和配置目标“main”。 2. 目标“main”不是由生成目标创建的:这可能是因为目标“main”是通过手动配置并编译而不是由CMake生成的。在CMake中,如果要为目标指定编译定义,该目标必须由CMake生成。要解决此问题,您可以尝试删除对目标“main”的手动配置,并使用CMake生成该目标。 要解决这个错误,您可以按照以下步骤进行操作: 1. 检查CMakeLists.txt文件,确保正确定义和配置目标“main”。如果没有定义目标“main”,请确保将其添加到CMakeLists.txt文件中。 2. 确保目标“main”是由CMake生成的。如果目标不是由CMake生成,尝试删除手动配置,并使用CMake生成该目标。 3. 检查是否在CMakeLists.txt中正确使用了target_compile_definitions命令来为目标“main”指定编译定义。确保语法和参数正确。 4. 重新运行CMake配置和生成过程,确保所有更改都已正确应用。 总结:CMake错误:110(target_compile_definitions)是由于尝试为未被生成的目标指定编译定义而导致的。要解决此问题,需要确保正确定义和配置目标,并确保目标是由CMake生成的。 ### 回答3: 这个错误的原因是在CMakeLists.txt文件中使用了target_compile_definitions命令为一个名为"main"的生成目标指定编译定义,但是在该项目中找不到名为"main"的生成目标。 解决这个问题的方法是在CMakeLists.txt文件中确认是否存在名为"main"的生成目标,并且确保在使用target_compile_definitions命令之前已经定义了该目标。 首先,检查CMakeLists.txt文件中是否有add_executable命令用于定义名为"main"的可执行文件目标。例如,可以使用以下命令来定义一个名为"main"的可执行文件目标: add_executable(main ...) 其中,"..."表示其他与该目标相关的源文件或属性。 确认"main"的生成目标已经定义之后,在使用target_compile_definitions命令之前添加一行代码来指定该目标的编译定义,例如: target_compile_definitions(main PRIVATE MY_DEFINITION) 其中,"MY_DEFINITION"表示你希望为该目标定义的编译定义。 最后,重新运行CMake以重新生成项目并检查是否还存在相同的错误。如果按照以上步骤进行操作,应该就能够修复该CMake错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值