亲爱的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)