如何使用CMAKE导出编译命令?

kqhtkvqz  于 2023-01-13  发布在  其他
关注(0)|答案(4)|浏览(216)

我一直在尝试使用clang-modernizeCMAKE_EXPORT_COMPILE_COMMANDS的建议,在这个工具的帮助。
使用此选项,cmake会生成一个JSON文件,其中包含编译信息,如include路径(see also)。
这个变量在cmake的命令行上是可以接受的,但是cmake --help-variable CMAKE_EXPORT_COMPILE_COMMANDS不起作用(这与this mailing list posting一致)。
有人知道怎么用吗?
我也可以用它与cppcheck。

更多信息

我在一个clang developer forum上发现这个cmake特性并不是在所有的生成器上都可用。这在将来可能会改变,同时我的问题仍然存在,我也会尝试看看如果我使用Visual Studio之外的其他生成器会发生什么。

mzsu5hc0

mzsu5hc01#

我建议设置

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

在CMakeList.txt文件中

cdmah0mi

cdmah0mi2#

在CMake 3.5中,CMAKE_EXPORT_COMPILE_COMMANDS选项是supported by the Ninja and Makefiles generators
这意味着要生成JSON编译数据库,必须选择支持它的生成器。
例如,在UNIX上:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 /path/to/src

(as默认情况下,它使用生成文件生成器)
否则,您可以显式指定生成器,如下所示:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 /path/to/src -G Ninja

或者:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 /path/to/src -G 'Unix Makefiles'

或者cmake支持的另一个makefile变体-cmake --help的输出中包含一个受支持的生成器列表。
请注意,编译数据库JSON文件是在cmake执行时生成的,而不是在编译时。此外,在最近的clang版本(例如clang >= 3.8)中,clang-modernize被合并到clang-tidy中。

l2osamch

l2osamch3#

我也不能在VisualStudio生成器上工作,但是,它使用“NMake Makefile”生成器工作。

C:\work\build>cmake -G "NMake Makefiles"  -DCMAKE_EXPORT_COMPILE_COMMANDS=ON  ..
cgvd09ve

cgvd09ve4#

第一个是在CMakelists.txt中使用CMAKE_EXPORT_COMPILE_COMMANDS ON,或者使用以下参数运行CMake:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..

1.Option:
下面是一个简单的源代码和构建树,让大家明白.

.
├── build
├── cars
│   ├── car.cpp
│   ├── car.h
│   └── CMakeLists.txt
├── CMakeLists.txt
└── main.cpp

main.cpp

#include <iostream>

#include "car.h"

int main (int argc, char *argv[])
{
    std::cout << "car - main function" << std::endl;
    showCarName();
    return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.20)
project(Cars
    VERSION 0.1
    HOMEPAGE_URL "github/alitokur"
    LANGUAGES CXX
    )

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

    add_executable(carApp main.cpp)
    add_subdirectory(cars)
    target_link_libraries(carApp PRIVATE cars)

cars/CMakeLists.txt

add_library(cars OBJECT
    car.cpp
    )
target_include_directories(cars PUBLIC .)

目标链接目录允许main.cpp在不提供相对路径的情况下包含cars. h文件。您应该在project()定义之后使用set(CMAKE_EXPORT_COMPILE_COMMANDS ON),因为有时其他工具会覆盖此设置,这就是为什么您看不到compile_commands. json。

相关问题