使用CMAKE,NINJA和CLANG构建项目,以竞争2019年
Build project using CMake, Ninja and clang for VS 2019
所以,我想使用cmake和clang作为VS2019的前端来构建我的项目。我已经尝试了什么: cmakelists.txt
cmake_minimum_required(VERSION 3.11 FATAL_ERROR)
#(CMAKE_INSTALL_PREFIX "C:\Program Files\LLVM\bin")
project(sink)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -std=c++17 -pedantic")
set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
set(BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_DIR}/bin")
file(GLOB SOURCES "${SRC_DIR}/*.cpp" "${SRC_DIR}/*.cc" "${SRC_DIR}/*.c")
file(GLOB HEADERS "${INCLUDE_DIR}/*.h" "${INCLUDE_DIR}/*.hpp")
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
cmakesettings.json
{
"configurations": [
{
"name": "x64-Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [ "msvc_x64" ],
"buildRoot": "${env.USERPROFILE}\CMakeBuilds\${workspaceHash}\build\${name}",
"installRoot": "${env.USERPROFILE}\CMakeBuilds\${workspaceHash}\install\${name}",
"cmakeCommandArgs": "-H. -G Ninja -Bbuild -DCMAKE_CXX_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe"",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": []
}
]
}
和哪个错误我得到:
1> CMake generation started.
1> Command line: E:VS19COMMON7IDECOMMONEXTENSIONSMICROSOFTCMAKECMakebincmake.exe -G "Ninja" -DCMAKE_INSTALL_PREFIX:PATH="C:UsersthehaCMakeBuilds7c084052-2033-9235-9a50-93f9ca5000beinstallx64-Debug" -DCMAKE_CXX_COMPILER:FILEPATH="E:/VS19/VC/Tools/MSVC/14.20.27404/bin/HostX86/x64/cl.exe" -DCMAKE_C_COMPILER:FILEPATH="E:/VS19/VC/Tools/MSVC/14.20.27404/bin/HostX86/x64/cl.exe" -H. -G Ninja -Bbuild -DCMAKE_CXX_COMPILER:PATH="C:Program FilesLLVMbinclang-cl.exe" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_MAKE_PROGRAM="E:VS19COMMON7IDECOMMONEXTENSIONSMICROSOFTCMAKENinjaninja.exe" "C:Usersthehaprojectssink"
1> Working directory: C:UsersthehaCMakeBuilds7c084052-2033-9235-9a50-93f9ca5000bebuildx64-Debug
1> [CMake] -- The C compiler identification is MSVC 19.20.27404.0
1> [CMake] -- The CXX compiler identification is Clang 7.0.1
1> [CMake] -- Check for working C compiler: E:/VS19/VC/Tools/MSVC/14.20.27404/bin/HostX86/x64/cl.exe
1> [CMake] -- Check for working C compiler: E:/VS19/VC/Tools/MSVC/14.20.27404/bin/HostX86/x64/cl.exe -- works
1> [CMake] -- Detecting C compiler ABI info
1> [CMake] -- Detecting C compiler ABI info - done
1> [CMake] -- Detecting C compile features
1> [CMake] -- Detecting C compile features - done
1> [CMake] -- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang-cl.exe
1> [CMake] -- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang-cl.exe -- broken
1> [CMake] CMake Error at E:/VS19/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.13/Modules/CMakeTestCXXCompiler.cmake:45 (message):
1> [CMake] The C++ compiler
1> [CMake]
1> [CMake] "C:/Program Files/LLVM/bin/clang-cl.exe"
1> [CMake]
1> [CMake] is not able to compile a simple test program.
1> [CMake]
1> [CMake] It fails with the following output:
1> [CMake]
1> [CMake] Change Dir: C:/Users/theha/CMakeBuilds/7c084052-2033-9235-9a50-93f9ca5000be/build/x64-Debug/build/CMakeFiles/CMakeTmp
1> [CMake]
1> [CMake] Run Build Command:"E:VS19COMMON7IDECOMMONEXTENSIONSMICROSOFTCMAKENinjaninja.exe" "cmTC_9e38f"
1> [CMake] [1/2] Building CXX object CMakeFilescmTC_9e38f.dirtestCXXCompiler.cxx.obj
1> [CMake] FAILED: CMakeFiles/cmTC_9e38f.dir/testCXXCompiler.cxx.obj
1> [CMake] C:PROGRA~1LLVMbinclang-cl.exe /nologo -TP /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MDd /Zi /Ob0 /Od /RTC1 /JMC /showIncludes /FoCMakeFilescmTC_9e38f.dirtestCXXCompiler.cxx.obj /FdCMakeFilescmTC_9e38f.dir -c testCXXCompiler.cxx
1> [CMake] clang-cl.exe: error: no such file or directory: '/JMC'
1> [CMake] ninja: build stopped: subcommand failed.
1> [CMake]
1> [CMake]
1> [CMake]
1> [CMake]
1> [CMake] CMake will not be able to correctly generate this project.
1> [CMake] Call Stack (most recent call first):
1> [CMake] CMakeLists.txt:5 (project)
1> [CMake] -- Configuring incomplete, errors occurred!
1> [CMake] See also "C:/Users/theha/CMakeBuilds/7c084052-2033-9235-9a50-93f9ca5000be/build/x64-Debug/build/CMakeFiles/CMakeOutput.log".
1> [CMake] See also "C:/Users/theha/CMakeBuilds/7c084052-2033-9235-9a50-93f9ca5000be/build/x64-Debug/build/CMakeFiles/CMakeError.log".
1> [CMake]
1> CMake generation finished.
1> E:VS19COMMON7IDECOMMONEXTENSIONSMICROSOFTCMAKECMakebincmake.exe -G "Ninja" -DCMAKE_INSTALL_PREFIX:PATH="C:UsersthehaCMakeBuilds7c084052-2033-9235-9a50-93f9ca5000beinstallx64-Debug" -DCMAKE_CXX_COMPILER:FILEPATH="E:/VS19/VC/Tools/MSVC/14.20.27404/bin/HostX86/x64/cl.exe" -DCMAKE_C_COMPILER:FILEPATH="E:/VS19/VC/Tools/MSVC/14.20.27404/bin/HostX86/x64/cl.exe" -H. -G Ninja -Bbuild -DCMAKE_CXX_COMPILER:PATH="C:Program FilesLLVMbinclang-cl.exe" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_MAKE_PROGRAM="E:VS19COMMON7IDECOMMONEXTENSIONSMICROSOFTCMAKENinjaninja.exe" "C:Usersthehaprojectssink" returned with exit code: 1
那么,我如何解决?也许我做错了什么,但我真的不明白什么?我还看到了使用vcvarsall.bat和set cxx和cxxflags的建议,但这无济于事。
您的解决方案有两个问题:
-
您正在用" -bbuild"定义一个构建目录,该目录与
"buildRoot"
属性中的cmakesettings.json中定义的构建目录不同。这将使视觉工作室表现不佳,例如它将在'$ {buildroot}'中寻找cmakecache.txt,而不是'$ {buildroot}/build'。 -
您正在将CMAKE_CXX_COMPILER的两个定义传递给Cmake,一个带有" Cl.exe",另一个带有" Clang-Cl.exe"。
您可以通过传递这些值来解决这两个问题:
{
"configurations": [
{
"name": "Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [
"msvc_x64"
],
"buildRoot": "${env.USERPROFILE}\CMakeBuilds\${workspaceHash}\build\${name}",
"installRoot": "${env.USERPROFILE}\CMakeBuilds\${workspaceHash}\install\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": [
{
"name": "CMAKE_CXX_COMPILER",
"type": "PATH",
"value": "C:\Program Files\LLVM\bin\clang-cl.exe"
},
{
"name": "CMAKE_C_COMPILER",
"type": "PATH",
"value": "C:\Program Files\LLVM\bin\clang-cl.exe"
}
]
}
]
}
关于与/JMC
未识别的标志有关的错误传递给clang-cl.exe,该标志当前不受clang-cl.exe的支持,因此您需要将此补丁应用于本地cmake安装(位于下方(位于下方) VS_INSTALLATION_FOLDERCommon7IDECommonExtensionsMicrosoftCMakeCMake
)
好吧,也许有人会发现我的解决方案有用。我如何更改我的 cmakelists.txt :
cmake_minimum_required(VERSION 3.11 FATAL_ERROR)
project(sink)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Xclang -std=c++17 -Xclang -pedantic")
set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
set(BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_DIR}/bin")
file(GLOB SOURCES "${SRC_DIR}/*.cpp" "${SRC_DIR}/*.cc" "${SRC_DIR}/*.c")
file(GLOB HEADERS "${INCLUDE_DIR}/*.h" "${INCLUDE_DIR}/*.hpp")
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
和 cmakesettings.json :
{
"configurations": [
{
"name": "Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [ "msvc_x64" ],
"buildRoot": "${env.USERPROFILE}\CMakeBuilds\${workspaceHash}\build\${name}",
"installRoot": "${env.USERPROFILE}\CMakeBuilds\${workspaceHash}\install\${name}",
"cmakeCommandArgs": "-DCMAKE_CXX_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe" -DCMAKE_CXX_FLAGS:STRING="/DWIN32 /D_WINDOWS /GR /EHsc" -DCMAKE_CXX_FLAGS_DEBUG:STRING="/MDd /Zi /Ob0 /Od /RTC1"",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": []
}
]
}
现在所有工作。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 使用CMAKE,NINJA和CLANG构建项目,以竞争2019年