如何使用LLVM在Windows for ARM上编译C++程序?

2024-02-20

Aim仅使用 LLVM 在 Windows for ARM 上编译 C++ 程序。

WhyLLVM 因为宽松的许可。

我开始怀疑我对LLVM的理解是否正确。

在主机上做

  1. 使用 clang(前端)生成中间表示。该表示与目标无关。
  2. 使用llc(后端)生成目标汇编代码。
  3. 使用 lld-link.exe 生成可执行文件。

然后在目标机器上执行。

主机Windows 10,64 位

靶机用arm cortex-a57驱动PX

该程序

int main(int argc, char* argv[]) 
{
    int x=41;
    x++;
    return x;
}

我已经检查并编译了 LLVM(使用 Visual Studio 2015,发布版本,CPU = x64)

我的尝试

clang.exe -target arm -march=armv8-a -mcpu=cortex-a57 -mfloat-abi=hard  -emit-llvm -c -o main.bc  main.cpp
llc.exe -march=arm -mcpu=cortex-a57 -mattr=a57,armv8-a,v8 -meabi=gnu -o main.s main.bc
lld-link.exe /entry:main /machine:arm main.s

Error

lld-link.exe: error: main.s: unknown file type

然后我尝试在Windows上做前端步骤,在arm机器上做后端。

clang.exe -target arm -march=armv8-a -mcpu=cortex-a57 -mfloat-abi=hard  -emit-llvm -c -o main.bc  main.cpp
llc.exe -march=arm -mcpu=cortex-a57 -mattr=a57,armv8-a,v8 -meabi=gnu -o main.s main.bc
SCP main.s to the arm machine. SSH and
gcc main.s (using gcc as a test. LLVM should do this.)

Error

main.s: Assembler messages:
main.s:2: Error: unknown pseudo-op: `.syntax'
main.s:3: Error: unknown pseudo-op: `.eabi_attribute'
main.s:9: Error: unknown pseudo-op: `.fpu'
main.s:26: Error: junk at end of line, first unrecognized character is `@'
main.s:29: Error: unknown pseudo-op: `.code'
main.s:31: Error: unknown pseudo-op: `.fnstart'
main.s:32: Error: junk at end of line, first unrecognized character is `@'
main.s:34: Error: operand 1 should be an integer register -- `mov r2,#0'
main.s:41: Error: operand 1 should be an integer or stack pointer register -- `add r0,r0,#1'
main.s:45: Error: unknown mnemonic `bx' -- `bx lr'
main.s:48: Error: unknown pseudo-op: `.cantunwind'
main.s:49: Error: unknown pseudo-op: `.fnend'
main.s:50: Error: junk at end of line, first unrecognized character is `@'

所以我尝试只针对Windows

clang.exe  -emit-llvm -c -o main.bc  main.cpp
llc.exe -march=x86 -c -o main.s main.bc
ld.lld.exe main.s

Error

ld.lld.exe: error: main.s:1: unknown directive: .text

然后,使用 gcc 代替 ld.lld.exe(再次使用 gcc 作为测试。LLVM 应该这样做。)

clang.exe  -emit-llvm -c -o main.bc  main.cpp
llc.exe -march=x86 -c -o main.s main.bc
gcc main.s -o main.exe

这样可行。为了测试我输入

main.exe
echo Exit Code is %errorlevel%

返回 42

一般问题

仅使用 LLVM(没有 gcc,没有从 ARM 下载任何内容)在 Windows 下针对 ARM CPU 编译 C++ 程序的步骤是什么?

具体问题

  1. 自编译LLVM附带的工具(例如clang.exe、llc.exe、lld.exe)可以在Windows目标arm上编译可执行文件吗?例如lld还在开发中吗?
  2. 为什么我尝试在 Windows 下针对 Windows 进行编译和链接会失败?
  3. 在主机上链接目标时,头文件和库(例如 libstdc++)来自哪里?我想我需要从手臂机器上获取这些?将它们复制到主机并告诉链接器在哪里可以找到它们?那是对的吗?

Update

所以我最初尝试过使用 Clang 交叉编译 https://clang.llvm.org/docs/CrossCompilation.html

clang.exe --target=arm --sysroot=c:\code\clang\FromCmdLine main.cpp  -v

结果是

clang.exe: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

-v 的详细信息是

 "C:\\llvm\\clang.exe" -cc1 -triple armv4t-- -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -target-cpu arm7tdmi -target-feature +soft-float -target-feature +soft-float-abi -target-feature -fp-only-sp -target-feature -d16 -target-feature -vfp2 -target-feature -vfp3 -target-feature -fp16 -target-feature -vfp4 -target-feature -fp-armv8 -target-feature -neon -target-feature -crypto -target-feature +strict-align -target-abi aapcs -msoft-float -mfloat-abi soft -fallow-half-arguments-and-returns -dwarf-column-info -debugger-tuning=gdb -v -resource-dir "c:\\llvm\\clang\\7.0.0" -isysroot "c:\\code" -fdeprecated-macro -fdebug-compilation-dir "c:\\code" -ferror-limit 19 -fmessage-length 293 -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o "C:\\Users\\AppData\\Local\\Temp\\main-b17d06.o" -x c++ main.cpp
clang -cc1 version 7.0.0 based upon LLVM 7.0.0svn default target x86_64-pc-win32
ignoring nonexistent directory "c:\code\usr/local/include"
ignoring nonexistent directory "c:\code\usr/include"
#include "..." search starts here:
#include <...> search starts here:
 C:\llvm\clang\7.0.0\include
End of search list.
 "C:\\MinGW\\bin\\gcc.exe" "--sysroot=c:\\code" -v -o a.out "C:\\Users\\AppData\\Local\\Temp\\main-b17d06.o"
Using built-in specs.
COLLECT_GCC=C:\MinGW\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --with-gmp=/mingw --with-mpfr --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --enable-libgomp --disable-libvtv --enable-nls
Thread model: win32
gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
COMPILER_PATH=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/;c:/mingw/bin/../libexec/gcc/;c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/
LIBRARY_PATH=c:/mingw/bin/../lib/gcc/mingw32/6.3.0/;c:/mingw/bin/../lib/gcc/;c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/;c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../;c:/code/clang/FromCmdLine/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'a.out' '-mtune=generic' '-march=i586'
 c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/collect2.exe -plugin c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/liblto_plugin-0.dll -plugin-opt=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\AppData\Local\Temp\ccufvVIA.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=c:\code\clang\FromCmdLine -Bdynamic -o a.out c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o -Lc:/mingw/bin/../lib/gcc/mingw32/6.3.0 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../.. -Lc:/code/clang/FromCmdLine/lib C:\Users\AppData\Local\Temp\main-b17d06.o -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtend.o
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: C:\Users\AppData\Local\Temp\main-b17d06.o: Relocations in generic ELF (EM: 40)
C:\Users\AppData\Local\Temp\main-b17d06.o: error adding symbols: File in wrong format

Update

这并不能完全回答我的问题,但它确实帮助我进步。

为了更好地理解我发现交叉工具-NG https://crosstool-ng.github.io/有用,尤其是他们的文档 https://crosstool-ng.github.io/docs/(第 1 章至第 5 章)。

然后我读了cmake交叉编译 https://cmake.org/cmake/help/v3.6/manual/cmake-toolchains.7.html文档。

我写了一个小的 cmake C++ 测试。

Helloworld.cpp

#include <iostream>
int main(int argc, char *argv[])
{
   std::cout << "Hello World!" << std::endl;
   return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.9)
project (hello)
add_executable(hello helloworld.cpp)

cmake 的目标特定配置。这是来自4 https://cmake.org/cmake/help/v3.6/manual/cmake-toolchains.7.html.

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_SYSROOT /home/user/x-tools/aarch64-unknown-linux-gnueabi/aarch64-unknown-linux-gnueabi/sysroot/)
set(CMAKE_STAGING_PREFIX /home/user/crosscompile/stage)

set(tools /home/user/x-tools/aarch64-unknown-linux-gnueabi)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-unknown-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-unknown-linux-gnueabi-g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

和命令行

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain_file.txt ..

该交叉编译为 ARM,程序在 ARM 机器上运行。

但这并没有使用 LLVM/Clang。为了使用 LLVM,我想到了更改工具链配置以使用

set(tools /usr/bin)
set(CMAKE_C_COMPILER ${tools}/clang)
set(CMAKE_CXX_COMPILER ${tools}/clang++)

失败是因为该 bin 文件夹适用于主机。

我还尝试使用 AArch64 下载http://releases.llvm.org/download.html http://releases.llvm.org/download.html。是的,那也行不通。

总而言之,这就是所需要的。

  1. sysroot 文件夹,其中包含目标系统的 lib 和 include 文件夹。好的,sysroot 文件夹中需要有比 lib 和 include 更多的内容。
  2. 目标系统的工具链(编译器、汇编器、链接器)。

这就是我必须做的,为了获得概念验证工作,仅使用 llvm 进行交叉编译,主机 = linux x86_64 和目标 = DrivePX (arm aarch64)。 (也适用于主机 = Windows 10 x86_64。)

我推荐一个工具,比如交叉工具-ng http://crosstool-ng.github.io/它为您设置了一个交叉编译工具链,但下面的步骤显示了幕后发生的事情,并且它仅使用 llvm。

  1. On the host computer, checkout and compile LLVM including Clang
    • see http://llvm.org/docs/GettingStarted.html http://llvm.org/docs/GettingStarted.html.
    • 这需要很长时间,因此需要进行发布构建。还要确保您有足够的空间 (GB)。
    • 告诉 cmake 进行发布构建,例如
    • CC=gcc CXX=g++ cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm/
    • 然后调用make。
  2. Call clang on the host computer.
    • 记得设定目标,例如--target=aarch64-linux-gnu
    • 告诉 clang 使用 llvm 链接器,即-fuse-ld=lld
    • clang --target=aarch64-linux-gnu -v main.cpp -o main -fuse-ld=lld
  3. 会出现很多链接器错误

ld.lld:错误:无法找到库-lgcc

ld.lld:错误:无法找到库-lgcc_s

ld.lld:错误:无法找到库-lc

  1. 还有一些有关缺少 crtX.o 文件的错误,例如

ld.lld: 错误: 无法打开 crt1.o: 没有这样的文件或目录

  1. On the target machine find, all the libgcc, libc, etc. files.
    • 请记住复制完整版本的库,例如对于 libgcc_s.so 复制 libgcc_s.so.1
    • 将这些文件复制到主机。
    • 告诉 clang 在哪里可以找到这些库,例如将文件复制到名为 libs 的文件夹中
    • clang --target=aarch64-linux-gnu -v main.cpp -o main -fuse-ld=lld -L./libs
    • 还要记住,链接器正在寻找例如libgcc_s.so 因此创建符号链接,例如libgcc_s.so.1。
  2. 将 crtX.o 文件从目标复制到主机。将它们放在 main.cpp 旁边。
  3. 然后又出现一个错误

ld.lld:错误:未定义符号:__libc_csu_fini

  • 该符号位于 libc_nonshared.a 中。和这个answer https://stackoverflow.com/questions/6656317/linking-a-c-program-directly-with-ld-fails-with-undefined-reference-to-libc-c帮助了。

libc.so 是一个链接器脚本,它告诉链接器引入共享库 libc.so.6 和非共享部分 libc_nonshared.a

  • 在主机上找到并打开 libc.so 并查看 libc.so.6 和 libc_nonshared.a 的位置。
  • 将它们复制到主机。
  • 告诉链接器使用这两个库,即-lc -lc_nonshared
  • clang --target=aarch64-linux-gnu -v main.cpp -o main -fuse-ld=lld -L./libs -lc -lc_nonshared

我的短文本代码仅依赖于 libc、libgcc,不需要头文件。如果您的代码需要其他库和头文件,您必须将它们从目标复制到主机。


Update Read 这个问题 https://stackoverflow.com/questions/51173869/why-does-clang-still-need-libgcc-a-to-compile-my-code如果您想了解 libgcc。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用LLVM在Windows for ARM上编译C++程序? 的相关文章

  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • 在动态事件处理程序中引用“this”

    在我的 myClass 类中 我使用 Reflection Emit 为 myClass 类成员之一动态编写事件处理程序 我已经成功地做到了这一点 现在 我想修改事件处理程序以调用 myClass 类中的实例方法之一 但是 我无法弄清楚如何
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 如何在不实例化一个类的情况下检查它是否继承了另一个类? [复制]

    这个问题在这里已经有答案了 假设我有一个如下所示的类 class Derived some inheritance stuff here 我想在我的代码中检查类似的内容 Derived is SomeType 但看起来像is运算符需要 De
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • 编译器错误“错误:在文件范围内可变地修改了‘字符串’”

    考虑 include
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • 使用 CMake 设置应用程序图标

    有没有跨平台的方法来使用 CMake 设置应用程序图标 我正在使用 Cmake 3 0 2 和 Qt 5 4 在Qt中文档 http doc qt io qt 5 appicon html显示了一种方法 但它不是跨平台的 CMake 不会为
  • Heroku 上 React 应用程序的简单密码保护

    我有一个简单的 React 应用程序 是用 create react app 创建的 我想将其部署到 Heroku 或简单的地方 并进行密码保护 保护可以非常简单 只需一个密码就可以了 我开始研究 HTTP 基本身份验证 但没有找到简单的答
  • 为什么 PathPrefixStrip 可以工作而 PathPrefix 不能?

    我有一个 GatsbyJS 静态站点 prefix paths The pathPrefix被设定为 environment test in gatsby config js 它被部署到运行 Traefik 的 docker swarm 中
  • 本地目录路径

    一个相当简单的问题 如何找到我的exe所在的本地目录的路径 就像我有一个 exe 一样 在程序中我必须在 exe 所在的目录中创建一个 txt 文件 语言 C 因此 如果 exe 位于 C Temp 并从那里启动 我的 txt 应该在 C
  • 使用 R 删除列表中空的零长度行

    我有数据框列表 有些是空的 如何删除它们 S566X7221 1 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24
  • 如何从 Google Colab 访问我的 Google 云端硬盘文件?

    我使用以下网址从网址下载了图像urlretrieve urllib 在 Google Colab 中 但是 下载图像后 我无法找到图像 from google colab import drive drive mount content g
  • Vaadin:如何显示 MySQL 数据库中的数据?

    我正在开发 Vaadin Flow 版本 14 1 应用程序 但遇到了这个问题 我无法将其直接与 MySQL 数据库连接 我已经与 Maven 设置了 JDBC 连接 还创建了一个名为 Datasource 的单例类 在其中存储我的值和方法
  • 如何使用VBA在Excel中的所有行前面添加单引号

    我有一个电子表格 其中包含带有日期的第一列 我希望文本保留为 May 21 但采用字符串形式 单元格值应该是 May 21 但是当我尝试将其转换为字符串时 它使用 5 位数字 如果我将列保留为日期格式 它会首先自动选择 May 因此即使格式
  • 用于特定文本模式的 PHP 正则表达式

    在我的网站上 我在正文中插入了项目创建的年份 并将其替换为 六年前 或者无论有多长 所以在我的内容中我有 我们自 1998 年开始营业 并在 2011 年前制作了这种包装设计 我试图使用正则表达式将 2011 放入变量中以便稍后搜索和替换
  • 复制矩阵的一行或一列并将其插入到下一行/列中

    我想知道 MATLAB 中是否有一种简单的方法来执行以下操作 我想复制矩阵的行或列并将其插入到下一行 列中 例如 给定一个 3x3 矩阵 1 2 3 4 5 6 7 8 9 我想复制第一行并将其作为第二行插入 1 2 3 1 2 3 4 5
  • 提取模式两端由标识符括起来的多行

    我正在尝试从日志文件中提取特定事件的跟踪 为了查找相关事件 我查找 PATTERN 为了提取事件的完整跟踪 我希望提取由 SEPARATOR 包围的模式两端的行 例如 如果日志文件的内容是 Line1 Line2 SEP Line3 Lin
  • C# 显示隐藏窗口

    我正在开发一个 Excel 插件 在某些时候 我可以接收异步事件 如果 Excel 窗口在这些事件上隐藏 我需要能够显示该窗口 我能够存储Hwnd属性 我相信它必须是一个不可变的 int 引用来标识我的 Excel 窗口 有人可以详细说明这
  • 在 Php 中连接两个表[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有两张桌子 表1 类别 Id na
  • XML 架构中的数字 ID 类型

    我需要使用 XML 模式定义具有给定模式的 ID 类型 到目前为止我所拥有的是这样的
  • 将 LaTeX 表格直接打印到图像(PNG 或其他)

    有没有办法从 R 中将 LaTeX 表格直接打印到图像文件 以包含在另一个文档 网页中 基本上 我想向一个函数提供 LaTeX 代码 该函数将其作为图像保存到工作目录中 白日梦 有各种 LaTeX 到图像转换器脚本 旨在执行诸如将方程转换为
  • 将 tcp_max_tw_buckets 设置为非常小的值有什么副作用?

    我知道将 tcp max tw buckets 设置为相对较小的数字 例如 30000 或 50000 是很正常的 以避免主机有大量时间等待状态连接并且应用程序无法打开新连接的情况 这是被提及很多次的事情 比如这样的问题 如何减少TIME
  • NodeJS - 来自 app.js 的第三方 Api 调用

    我需要从 NodeJS 后端调用第 3 方 api 并将数据返回到前端的 ajax 调用 下面是我的代码 router post get data function request response var city name reques
  • 如何根据屏幕尺寸将Epub Html拆分为页面

    我正在开发一个读取电子书 epub 格式 的 Android 应用程序 目前我正在使用 Paul Siegeman 的 epublib 库 它确实是一个非常好的 epub 阅读器 但它有一些限制 例如我需要的 你无法水平移动页面 就像阅读一
  • Android 将多张位图合并为一张大图出错,无法回收位图

    我想将 ArrayList 中包含的许多小位图合并为一张大位图 但是 我不知道为什么大位图会循环 这意味着它似乎只复制数组中的第一个元素 我尝试绘制数组中的每个小位图进行测试 它工作正常 但是当我像下面的代码一样运行循环时 它会出错 另外
  • 如何使用LLVM在Windows for ARM上编译C++程序?

    Aim仅使用 LLVM 在 Windows for ARM 上编译 C 程序 WhyLLVM 因为宽松的许可 我开始怀疑我对LLVM的理解是否正确 在主机上做 使用 clang 前端 生成中间表示 该表示与目标无关 使用llc 后端 生成目