我有一个带有 Visual Studio 2012 的 Jenkins slave,想为 x64 构建。我需要的是我在 Windows 开始菜单中运行工具提示链接时得到的提示环境。人们建议这样做(在 Jenkins Windows Batch 提示中):
call "%VS110COMNTOOLS%vsvars32.bat" x86_amd64
Run Code Online (Sandbox Code Playgroud)
但这还不够。PATH
,LIB
和LIBPATH
环境变量之间存在细微差别:其中的路径仅指向 x32 路径,例如指向
...;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\BIN;...
Run Code Online (Sandbox Code Playgroud)
代替
...;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\BIN\x86_amd64;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\BIN;...
Run Code Online (Sandbox Code Playgroud)
事实上,我正在尝试使用来自 CMake 的 Ninja 生成器进行构建,其中构建配置由提示环境确定。
我从源代码构建 Inkscape:
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ..
$ ninja install
Run Code Online (Sandbox Code Playgroud)
它返回错误如下。
[1002/1006] Building CXX object src/CMakeFiles/inkscape_base.dir/verbs.cpp.obj
[1003/1006] Linking CXX shared library bin\libinkscape_base.dll
FAILED: bin/libinkscape_base.dll src/libinkscape_base.dll.a
cmd.exe /C "cd . && C:\msys64\mingw64\bin\g++.exe -fopenmp -m64 -mms-bitfields -mthreads -mwindows -pthread -std=c++11 -g -shared -o bin\libinkscape_base.dll -Wl,--out-implib,src\libinkscape_base.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/inkscape_base.rsp && cd ."
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Error: export ordinal too large: 104116
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
Run Code Online (Sandbox Code Playgroud)
什么会导致此错误以及如何解决?
注意:我可以成功构建 Inkscape,无需-DCMAKE_BUILD_TYPE=Debug
.
我想在我的 x64 Windows 计算机上构建 x86 Windows 应用程序。
\n\n我使用 CMake、Ninja、clang-cl、lld-link 和 VS Build Tools 2017 以及以下 CMakeLists
\n\ncmake_minimum_required(VERSION 3.9)\nproject(Test CXX)\n\nadd_library(TestLib STATIC "")\ntarget_include_directories(TestLib\n PUBLIC\nTestLib/inc\n)\ntarget_sources(TestLib\n PRIVATE\n TestLib/src/Flop.cpp\n TestLib/src/testClass.cpp\n)\n\nadd_executable(Test "")\ntarget_sources(Test\n PRIVATE\n src/main.cpp\n)\ntarget_link_libraries(Test\n TestLib\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n我的设置适用于 x64 应用程序。我初始化构建环境并vcvars64
调用 cmake
cmake -G Ninja -DCMAKE_CXX_COMPILER:PATH="C:\\MeineProgramme\\LLVM\\bin\\clang-cl.exe" -DCMAKE_LINKER:PATH="C:\\MeineProgramme\\LLVM\\bin\\lld-link.exe"\n
Run Code Online (Sandbox Code Playgroud)\n\n这会产生完美的忍者构建文件并生成功能性可执行文件。
\n\n如果我想构建 x86 应用程序,CMake 无法检测构建环境。vcvars32
我使用或初始化构建环境,vcvarsamd64_x86
并使用与上面相同的命令来调用 CMake。这会导致在检测构建环境期间出现错误。
CMake错误日志有以下内容
\n\nCompiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed.\nCompiler: C:/MeineProgramme/LLVM/bin/clang-cl.exe \nBuild flags: \nId flags: \n\nThe output was:\n1120\nLINK : error LNK2001: Nicht …
Run Code Online (Sandbox Code Playgroud) 我在 Debian 9 上使用 Ninja 1.8.2 来使用 llvm-5.0 构建 llvm-6.0。
当我检查系统的CPU使用率时,我发现CPU并没有100%使用,而且还有足够的内存。
检查 cmake 的输出后,我发现它将并行链接作业限制为 2 个,因为在我的机器上运行的 llvm 也是并行运行的。
我想尝试解除该限制是否会使我的构建速度更快,但几乎没有任何相关文档。
编辑:
我检查了构建目录中的rules.ninja 文件的内容,并发现了这些:
#############################################
# Pools defined by global property JOB_POOLS
pool link_job_pool
depth = 2
Run Code Online (Sandbox Code Playgroud)
我还检查了 build.ninja 的内容并发现了这一点:
build lib/libLLVMDemangle.a: CXX_STATIC_LIBRARY_LINKER__LLVMDemangle lib/Demangle/CMakeFiles/LLVMDemangle.dir/ItaniumDemangle.cpp.o
LANGUAGE_COMPILE_FLAGS = -Ofast -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++1y -Wal l -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -W non-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fcolor-diagnostics -ffunction-sections -fdata-sections -flto=thin -O3 -D NDEBUG
OBJECT_DIR = lib/Demangle/CMakeFiles/LLVMDemangle.dir
POST_BUILD = :
PRE_LINK = : …
Run Code Online (Sandbox Code Playgroud) -j
在使用 gradle 构建 Android 应用程序时,我需要将参数传递给 ninja。(在 Windows 上)
为什么我需要这个?- 我们有巨大的统一 C++ 文件,需要大量内存才能编译。目前我没有足够的内存(约 10GB 可用)来在 8 个内核上并行编译它们。因此,当内存耗尽时,clang 会失败。
我看到 gradlecmake
使用--build
key运行,所以我试图在-j1
那里添加我的arg。但似乎arguments
字段仅用于 cmake 生成,因为它不会影响在构建阶段传递给 cmake 的命令行。
externalNativeBuild {
cmake {
cFlags "..."
cppFlags "..."
arguments "... -- -j1"
}
}
Run Code Online (Sandbox Code Playgroud)
我现在看到的唯一方法是ninja
用一些包装器替换-j
从那里传递。但这是我想使用的最后一个选项。感谢有关如何实现这种有效方式的任何想法。
我正在尝试从 IDE 在 Visual Studio 2019 上使用 Ninja 构建项目。我想使用与 VS 2019 发行版中集成的版本不同的 CMake 版本。我已经cmakeExecutable
在我的CMakeSettings.json文件中设置了变量指向我的 CMake 系统安装,并且使用 Visual Studio 生成器构建工作正常。但是,如果我使用 Ninja 作为生成器,Visual Studio 将使用 VS 集成版本的 CMake 回退。有没有办法使用 Ninja 和来自 IDE 的自定义 CMake 版本进行构建?
当我尝试运行 Meson 时,它抱怨找不到 Ninja v1.8.2 或更高版本。我跑了这个:
meson build-debug
Run Code Online (Sandbox Code Playgroud)
这导致了上面解释的错误。我有最新的工具:
忍者 v1.10.2
介子0.61.2
适用于 VS 2022 的 x64 本机工具命令提示符
我需要在 MSVC 2013和 MSVC 2019下构建基于 CMake 的项目。
通过使用 Ninja 生成器的 MSVC 2019,我使用以下命令成功构建了它:
cmake -S . -B build -GNinja "-DCMAKE_BUILD_TYPE:STRING=Release"
cmake --build build --target all
Run Code Online (Sandbox Code Playgroud)
在 MSVC 2013上我没有可用的 Ninja,所以我尝试了以下操作:
cmake -S . -B build -DCMAKE_BUILD_TYPE:STRING=Release
cmake --build build --target all
Run Code Online (Sandbox Code Playgroud)
无论如何,我收到以下错误并且没有构建任何内容:
MSBUILD : error MSB1009: Project file does not exist.
Switch: all.vcxproj
Run Code Online (Sandbox Code Playgroud)
知道如何在没有忍者的情况下建造它吗?(我无法安装它,因为我正在构建服务器上构建它。)
我刚刚在 vscode 中启动一个新的 flutter 项目,当我想调试该项目时,出现错误:
Could not find compiler set in environment variable CXX:
clang++.
Call Stack (most recent call first):
CMakeLists.txt:3 (project)
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
Exception: Unable to generate build files
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索,发现我的“cmake”包没有 g++.exe ,因此通过以下命令行手动安装它:
sudo apt-get install g++
但它不起作用,我该如何解决它?
当使用或编译器ninja
调用C 或 C++(因此是两个标签)项目时,输出不会使用 ANSI 颜色。clang
gcc
例如:
error
应该是红色的,但不是。
warning
应该是黄色/橙色,但不是。
一切都是同样的颜色,真的很难说清楚是怎么回事!