亲爱的C++编程员,
在使用Visual Studio工具链在Windows上构建一段时间后,我决定给Clang 5一个镜头.
我安装了LLVM 5.0.0二进制文件,Ninja构建环境,VS 2017工具和CMake 3.9.3.最终目标是能够使用VS Code编译C和C++应用程序,将CMake集成为"IDE",将Clang与LLD一起编译为编译器和链接器.
一个简单程序的编译和执行工作得非常好(相应终端历史的屏幕截图).Clang在VS Tools目录中自动检测到Windows的标准lib,并生成了可执行输出.
下一步是使用Ninja建立一个简单的构建(ninja.build文件和终端历史的截图).构建过程按预期工作,并像以前一样生成可运行的可执行文件.
当我开始将CMake集成到流程中时,问题就开始了.我的期望是CMake生成一个ninja构建文件并运行它,对吗?我尝试了以下CMakeLists文件
cmake_minimum_required(VERSION 3.9)
project(Test)
add_executable(Test main.c)
Run Code Online (Sandbox Code Playgroud)
并称为CMake cmake -G Ninja.由此产生的结果是令人失望的,我不明白,分别自己解决问题.
-- The C compiler identification is Clang 5.0.0
-- The CXX compiler identification is Clang 5.0.0
-- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe
-- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe -- broken
CMake Error at C:/Meine_Programme/CMake/share/cmake-3.9/Modules/CMakeTestCCompiler.cmake:51 (message):
The C compiler "C:/Meine_Programme/LLVM/bin/clang.exe" is not able to
compile a simple test program.
It fails with …Run Code Online (Sandbox Code Playgroud) 我正在使用带有Ninja生成器的Windows上的CMake
cmake -G Ninja ..
Run Code Online (Sandbox Code Playgroud)
这使用默认的Windows x86工具链.如何使用Ninja生成器指定x64?
PS:我知道如何使用Visual Studio生成x64
cmake -G "Visual Studio 12 2013 Win64 ..
Run Code Online (Sandbox Code Playgroud) 我目前在Windows上安装了cmake,clang和ninja.我正在尝试使用CMake生成一个忍者构建文件来编译一个非常简单的hello world程序.
我的CMakeLists.txt看起来像这样:
cmake_minimum_required(VERSION 2.8)
project(test_project)
add_executable(main main.cpp)
Run Code Online (Sandbox Code Playgroud)
main.cpp 是一个简单的hello world程序.
在命令行上我运行这个:cmake -G Ninja ..我得到以下错误:
-- The C compiler identification is Clang 3.5.0
clang.exe: error: no such file or directory: '/nologo'
clang.exe: error: no such file or directory: '/showIncludes'
-- The CXX compiler identification is Clang 3.5.0
clang.exe: error: no such file or directory: '/nologo'
clang.exe: error: no such file or directory: '/showIncludes'
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: …Run Code Online (Sandbox Code Playgroud) 我的ninja构建似乎陷入了特定命令,但是如果我手动运行该命令,它会快速完成,没有任何问题。
有没有办法输出ninja更多的调试信息,这样ninja -v我就可以找出它挂起的原因?
假设我有一个由几个子项目A,B,C,D组成的项目 ...... 所有子项目都依赖于A,它经常变化.此外,可能有一些进一步的依赖关系:在这个例子中,d依赖于B.
现在:很多人正在研究这些项目.主CMakeLists.txt文件应包含所有目录,以便构建all构建所有目录.但人们也希望能够只在其中一个项目上工作,而不必每次都构建/安装所有项目.
如果我正在研究D,我可以通过调用轻松构建"仅"D
cmake --build . --target D -- -j7
Run Code Online (Sandbox Code Playgroud)
要么
ninja -j7 D
Run Code Online (Sandbox Code Playgroud)
如果他们的某些东西发生了变化,这也将构建A和B. 完善.
但是如何在不触发构建全部的情况下仅为D调用安装?如果我打电话,我想这样:
ninja -j7 D install
Run Code Online (Sandbox Code Playgroud)
它只构建D(和依赖项),然后只安装D 及其依赖项(A和B). 相反,它构建目标all并安装所有.
我想保持目标所有人都在继续建设.所以EXCLUDE_FROM_ALL不是一个选项.但是朝那个方向走,我找不到任何解决办法.
所以我在考虑以下策略:
它会起作用吗?有没有更好的解决方案?
我们希望避免每个人都必须编辑主CMakeLists.txt文件以排除他不感兴趣的项目.解决方案应该可以移植到不同的操作系统.
编辑:
我尝试了我提出的策略,但它不起作用:在我的情况下,为目标设置一个install语句(即使指定为OPTIONAL)也会使EXCLUDE_FROM_ALL无效.在文档中更好地阅读我发现:
Installing a target with EXCLUDE_FROM_ALL set to true has undefined behavior.
Run Code Online (Sandbox Code Playgroud)
我也收到这个警告:
Target <targetname> has EXCLUDE_FROM_ALL set and will not be built by default but an install rule has been provided for it. CMake does not define behavior for this …Run Code Online (Sandbox Code Playgroud) 我下载了一个程序并想运行它。它来自github。
我进入experiments/segmentation/文件夹,然后在终端输入“python test.py --dataset PContext --model-zoo Encnet_ResNet50_PContext --eval”。
终端显示“RuntimeError: Ninja is required to load C++ extensions.”上网查了一晚上也没发现这样的问题。
有谁能够帮助我?我是第一次来这里提问
请遵循以下命令:
首先我这样做:
cmake -G Ninja ..
Run Code Online (Sandbox Code Playgroud)
然后:
cmake --build . -j10
Run Code Online (Sandbox Code Playgroud)
或者:
ninja -j10
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别?它们之间有优点还是缺点吗?
我尝试使用该命令ninja -C out/Debug chrome编译Chromium.
但错误消息msg说:
ninja error loading 'build.ninja': the system cannot find the file specified
ninja Entering dictory 'out/Debug'
Run Code Online (Sandbox Code Playgroud)
我能知道这是什么问题吗?
谢谢.
当我使用Makefile进行编译时,构建日志是丰富多彩且详细的。但是当我使用Ninja时,我只得到一行有进度的信息,没有百分比和颜色。如何使Ninja构建日志看起来像Makefile的日志?这是否可能,或者必须需要Ninja开发人员采取行动?
例子:
生成文件日志:

忍者日志:

PS欢迎任何方法,将在本地使用。
PPS如果没有人,就说目前这是不可能的。
这似乎是一个没有明确答案的常见问题。
情况是:我们有一个第 3 方依赖项,我们希望在构建依赖它的目标时在构建时安装它。大致是这样:
ExternalProject_Add(target-ep
DOWNLOAD_COMMAND <whatever>
BUILD_COMMAND ""
INSTALL_COMMAND ""
CONFIGURE_COMMAND "")
add_library(target-imp STATIC IMPORTED)
set_target_properties(target-imp PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES /path/to/install/include
IMPORTED_LOCATION /path/to/install/lib/libwhatever.a)
add_library(target INTERFACE)
target_link_libraries(target INTERFACE target-imp)
add_dependencies(target target-ep)
Run Code Online (Sandbox Code Playgroud)
(由于cmake 问题 15052 ,这里需要三个探戈)
当使用 Unix Makefiles 作为生成器时,这很好用。仅按需安装依赖项,所有构建都能正常工作。
但是,在 Ninja 上,这会立即失败,如下所示:
ninja: error: '/path/to/install/lib/libwhatever.a', needed by 'something', missing and no known rule to make it
Run Code Online (Sandbox Code Playgroud)
这是因为 Ninja 扫描依赖项的方式与 Make 不同(请参阅ninja issue 760)。所以我们要做的其实就是告诉 Ninja 这个外部依赖是存在的。我们能做到这一点:
ExternalProject_Add(target-ep
DOWNLOAD_COMMAND <whatever>
BUILD_BYPRODUCTS /path/to/install/lib/libwhatever.a
BUILD_COMMAND ""
INSTALL_COMMAND "" …Run Code Online (Sandbox Code Playgroud)