简体   繁体   English

如何在外部服务器上安装和使用嵌入式 C 的编译器?

[英]How can I install and use compilers for embedded C on an external server?

Short Question简短的问题
Is there an accepted way to run compilers / linkers for embedded software projects on a remote server and still be able to program and debug the software on local machine.是否有一种公认的方法可以在远程服务器上为嵌入式软件项目运行编译器/链接器,并且仍然能够在本地机器上对软件进行编程和调试。

Note I know every IDE will be different, so what I am after is how to define a work flow to accomplish this task assuming that the IDE can be ran using the.o/.elf files built from the remote server.注意我知道每个 IDE 都会有所不同,所以我所追求的是如何定义工作流程来完成此任务,假设 IDE 可以使用从远程服务器构建的.o/.elf 文件运行。

Areas of Concern关注的领域
1) Networking to a virtual Windows machine. 1) 与虚拟 Windows 机器联网。
2) How / when to transfer the source code to the server to build. 2)如何/何时将源代码传输到服务器进行构建。

Background背景
Each family of microprocessor that our software team works with requires it's own compiler, IDE, and programmer.我们的软件团队使用的每个微处理器系列都需要自己的编译器 IDE 和编程器。 This, overtime, creates many difficulties to overcome.这,加班,创造了许多需要克服的困难。

1) Each developer requires it's own, often pricey, license. 1) 每个开发人员都需要自己的、通常很昂贵的许可证。
2) To pick up a project that another developer started requires extra care to make sure all of the compiler settings are the same. 2) 要选择另一个开发人员启动的项目,需要格外小心,以确保所有编译器设置都相同。
3) Supporting legacy software may require an old compilers that conflict with the currently installed compiler. 3) 支持旧版软件可能需要与当前安装的编译器冲突的旧编译器。
... the list goes on and on. ......名单还在继续。

Edit: 7-10-2011 1:30 PM CST编辑:2011 年 7 月 10 日下午 1:30 CST
1) The compilers I am speaking of are indeed cross compilers 1)我说的编译器确实是交叉编译器
2) A short list of processor families this system ideally would support: Motorola Coldfire, PIC and STM8. 2) 该系统理想支持的处理器系列的简短列表:摩托罗拉 Coldfire、PIC 和 STM8。
3) Our Coldfire compiler is a variant of GCC, but we have to support multiple versions of it. 3) 我们的 Coldfire 编译器是 GCC 的变体,但我们必须支持它的多个版本。 All other compilers use a target specific compiler that does not provide a floating license.所有其他编译器都使用不提供浮动许可证的特定于目标的编译器。
4) To address littleadv, what I would like to accomplish is an external build server. 4)为了解决littleadv,我想要完成的是一个外部构建服务器。
5) We currently use a combination of SVN and GIT hosted on an online repository for version control. 5) 我们目前使用托管在在线存储库上的 SVN 和 GIT 的组合进行版本控制。 This is in fact how I thought I would be transferring files to the build server.这实际上是我认为我会将文件传输到构建服务器的方式。
6) We are stuck with Windows for most of the compilers. 6) 对于大多数编译器,我们都坚持使用 Windows。

I now believe that the direction to go is an external build server.我现在相信 go 的方向是外部构建服务器。 There a few obstacles to over come yet.还有一些障碍需要克服。 I will assume that we will have to transfer the source files to the server via version control software.我假设我们必须通过版本控制软件将源文件传输到服务器。 Seeing how multiple product lines require access to the same compilers, having an instance for each project does not seem practical.看到多个产品线如何需要访问相同的编译器,每个项目都有一个实例似乎不切实际。

Would it make sense to create a repository for each compiler that would include folders for build, source, include, output, etc... then have scripts on the users' end that takes care of moving files form the IDE's file structure to the required structure for the compiler?为每个编译器创建一个存储库是否有意义,该存储库将包含用于构建、源代码、包含、output 等的文件夹......然后在用户端有脚本,负责将文件从 IDE 的文件结构移动到所需的编译器的结构? This approach would keep the project repository from being thrashed and give a since of how many times a compiler has been used.这种方法可以防止项目存储库被破坏,并给出一个编译器被使用了多少次。 Thanks for all of the great responses so far!感谢您迄今为止的所有出色回应!

In my opinion implementing an automated build server would be the cleanest solution to what you're trying to achieve.在我看来,实现自动构建服务器将是您想要实现的最干净的解决方案。 With an additional benefit...continuous integration.还有一个额外的好处……持续集成。 (I'll touch on CI a bit later). (稍后我会谈到 CI)。

There are plenty of tools out there to use.有很多工具可供使用。 @Clifford has already mentioned CMake. @Clifford 已经提到过 CMake。 But some others are:但其他一些是:

  • Hudson (Open Source)哈德逊(开源)
  • CruiseControl (Open Source) CruiseControl (开源)
  • TeamCity (Commercial - But it has a fairly generous free version that allows up to 3 build agents and 20 build configurations. The enterprise version of TeamCity is what my company uses so my answer will be geared towards this as it's what I know but concepts will likely apply across multiple tools) TeamCity (商业 - 但它有一个相当慷慨的免费版本,最多允许 3 个构建代理和 20 个构建配置。TeamCity 的企业版是我公司使用的,所以我的答案将针对这个,因为这是我所知道的,但概念会可能适用于多种工具)

So first of all I'll try to explain what we do and suggest how this might work for you.因此,首先,我将尝试解释我们所做的工作,并建议这可能对您有用。 I don't suggest this is the accepted way to do things but it has worked for us.我不建议这公认的做事方式,但它对我们有用。 As I mentioned we use TeamCity for our build server.正如我提到的,我们使用 TeamCity 作为构建服务器。 Each software project is added into TeamCity and build configurations are set up.每个软件项目都添加到 TeamCity 中,并设置了构建配置。 The build configurations tell TeamCity when to build, how to build and where your project's SCM repository is.构建配置告诉 TeamCity 何时构建、如何构建以及项目的 SCM 存储库在哪里。 We use two different build configurations for each project, one we call "integration" which monitors the project's SCM repository and triggers an incremental build when a check-in is detected.我们为每个项目使用两种不同的构建配置,我们称之为“集成”,它监控项目的 SCM 存储库并在检测到签入时触发增量构建。 The other configuration we call "nightly" which triggers at a set time every night and performs a completely clean build.我们称之为“nightly”的另一种配置每晚在设定的时间触发并执行完全干净的构建。

Incidentally just a quick note regarding SCM.顺便提一下关于 SCM 的简短说明。 For this to work cleanest I think the SCM for each project should be used in a stable trunk topology.为了让这个工作最干净,我认为每个项目的 SCM 都应该在稳定的主干拓扑中使用。 If your developers all work from their own branches you'd probably need separate build configurations for each developer which I think would get unnecessarily messy.如果您的开发人员都在他们自己的分支上工作,您可能需要为每个开发人员单独构建配置,我认为这会变得不必要的混乱。 We've set up our build server with its own SCM user account but with read-only access.我们已经使用自己的 SCM 用户帐户设置了构建服务器,但具有只读访问权限。

So when a build is triggered for a particular build configuration the server grabs the latest files from the repository and sends them to a "build agent" which executes the build using a build script.因此,当针对特定构建配置触发构建时,服务器会从存储库中获取最新文件并将它们发送到“构建代理”,后者使用构建脚本执行构建。 We've used Rake to script our builds and automated testing but you can use whatever.我们已经使用Rake来编写我们的构建和自动化测试脚本,但您可以使用任何东西。 The build agent can be on the same PC as the server but in our case we have a separate PC because our build server is centrally located with the ICT department whereas we need our build agent to be physically located with my team (for automated on-target testing).构建代理可以与服务器在同一台 PC 上,但在我们的例子中,我们有一台单独的 PC,因为我们的构建服务器位于 ICT 部门的中心,而我们需要我们的构建代理与我的团队物理定位(用于自动化目标测试)。 So the toolchains that you use are installed on your build agent.因此,您使用的工具链安装在您的构建代理上。

How could this work for you?这对你有什么用?

Lets say you work for TidyDog and you have two projects on the go:假设您为 TidyDog 工作,并且您在 go 上有两个项目:

  1. "PoopScoop" is based on a PIC18F target compiled using the C18 compiler has its trunk located in your SCM at //PoopScoop/TRUNK/ “PoopScoop”基于使用 C18 编译器编译的 PIC18F 目标,其主干位于 SCM 中的//PoopScoop/TRUNK/
  2. "PoopBag" is based on a ColdFire target compiled with GCC has its trunk located at //PoopBag/TRUNK/ “PoopBag”基于使用 GCC 编译的 ColdFire 目标,其主干位于//PoopBag/TRUNK/

The compilers that you need in order to build all projects are installed on your build agent (We'll call it TidyDogBuilder).构建所有项目所需的编译器安装在构建代理上(我们将其称为 TidyDogBuilder)。 Whether that's the same PC that's running the build server or a separate box is dependent on your situation.是运行构建服务器的同一台 PC 还是单独的机器取决于您的情况。 Each project has it's own build script (eg //PoopScoop/Rakefile.rb and //PoopBag/Rakefile.rb ) which handles source file dependencies and invocation of the appropriate compilers.每个项目都有自己的构建脚本(例如//PoopScoop/Rakefile.rb//PoopBag/Rakefile.rb ),用于处理源文件依赖关系和适当编译器的调用。 You could for example go to //PoopScoop/ in command prompt, enter rake and the build script would take care of compiling the PoopScoop project within the command prompt.例如,您可以在命令提示符下将 go 输入到 //PoopScoop/,输入rake ,构建脚本将负责在命令提示符下编译 PoopScoop 项目。

You then have your build configurations set up on the build server.然后,您可以在构建服务器上设置构建配置。 A build configuration for PoopScoop for example would specify what SCM tool you're using and the repository location (eg //PoopScoop/TRUNK/ ), specify which build agent to use (eg TidyDogBuilder), specify where to find the appropriate build script and any necessary command to use (eg //PoopScoop/Rakefile.rb invoked with rake incremental:build ) and specify what event triggers a build (eg Detection of a check-in to //PoopScoop/TRUNK/ ).例如,PoopScoop 的构建配置将指定您正在使用的 SCM 工具和存储库位置(例如//PoopScoop/TRUNK/ ),指定要使用的构建代理(例如 TidyDogBuilder),指定在哪里可以找到合适的构建脚本和任何需要使用的命令(例如//PoopScoop/Rakefile.rb使用rake incremental:build调用)并指定触发构建的事件(例如检测到//PoopScoop/TRUNK/的签入)。 So the idea is that if someone submits a change to //PoopScoop/TRUNK/Source/Scooper.c the build server detects this change, grabs the latest revisions of the source files from the repository and sends them to the build agent to be compiled using the build script and in the end emails every developer that has a change in build with the build result.所以想法是,如果有人向//PoopScoop/TRUNK/Source/Scooper.c提交更改,构建服务器会检测到此更改,从存储库中获取源文件的最新版本并将它们发送到构建代理进行编译使用构建脚本,最后通过构建结果向每个在构建中发生更改的开发人员发送电子邮件。

If your projects need to be compiled for multiple targets you would just modify the project's build script to handle this (eg You might have commands like rake build:PIC18 or rake build:Coldfire ) and set up a separate build configuration on the build server for each target.如果您的项目需要针对多个目标进行编译,您只需修改项目的构建脚本来处理此问题(例如,您可能有rake build:PIC18rake build:Coldfire之类的命令)并在构建服务器上设置单独的构建配置每个目标。

Continuous Integration持续集成

So with this system you get continuous integration up and running.因此,有了这个系统,您就可以启动并运行持续集成。 Modify your build scripts to run unit tests as well as compile your project and you can have your unit testing being performed automatically after every change.修改您的构建脚本以运行单元测试以及编译您的项目,并且您可以在每次更改后自动执行单元测试。 The motive for this is to try to pick up problems as early as possible, as you're developing rather than being surprised during verification activities.这样做的动机是尽可能早地发现问题,因为您正在开发而不是在验证活动期间感到惊讶。

Closing Thoughts结束的想法

  • Developers not having all toolchain installations would be somewhat dependent on what work they do most often.没有安装所有工具链的开发人员在某种程度上取决于他们最常做的工作。 If it was me and my work tended to be mostly low level, interacting a lot with the hardware, not having the compilers on my workstation would annoy the bejeezes out of me.如果是我,我的工作往往是低级的,与硬件交互很多,我的工作站上没有编译器会惹恼我。 If on the other hand I was mostly working at an application level and could stub out hardware dependencies it may not be such a problem.另一方面,如果我主要在应用程序级别工作并且可以消除硬件依赖关系,那可能不是这样的问题。
  • TeamCity has a plugin for Eclipse with quite a cool feature. TeamCity 有一个 Eclipse 插件,具有非常酷的功能。 You can do personal builds which means that developers can run build of a pending changelist against any given build configuration.您可以进行个人构建,这意味着开发人员可以针对任何给定的构建配置运行挂起的更改列表的构建。 This means that the developer initiate a build of pre-commited code on the build server without having to actually submit their code to SCM.这意味着开发人员在构建服务器上启动预先提交代码的构建,而无需实际将其代码提交给 SCM。 We use this to trial changes against our current unit tests and static analysis as our expensive test tools are only installed on the build agent.我们使用它来针对我们当前的单元测试和 static 分析试验更改,因为我们昂贵的测试工具仅安装在构建代理上。
  • With regards to accessing build artifacts when "on the road" I agree, something like a VPN into your intranet is probably the easiest option.关于“在路上”访问构建工件,我同意,像 VPN 这样的东西进入你的 Intranet 可能是最简单的选择。

One part of your question that hasn't been addressed very much in the other answers (at least as of the time when I'm writing this) is how to transfer the files to the build server.您的问题的一部分在其他答案(至少在我写这篇文章的时候)没有得到很好的解决是如何将文件传输到构建服务器。 I can provide some experience on that point, as my own development process is reasonably close to that part of your situation.我可以在这一点上提供一些经验,因为我自己的开发过程与您的情况相当接近。

In my case, I use the "Unison" utility to mirror a section of my home directory on my development laptop to a section of home directory on the build servers.就我而言,我使用“Unison”实用程序将我的开发笔记本电脑上的主目录的一部分镜像到构建服务器上的主目录的一部分。 From a programmer's point of view, Unison is basically a wrapper around rsync, with a stored set of checksums to determine whether files on either end of the connection have been modified.从程序员的角度来看,Unison 基本上是 rsync 的包装器,其中存储了一组校验和,以确定连接两端的文件是否已被修改。 It uses this to do a bi-directional synchronization;它使用它来进行双向同步; any modifications I make locally get transferred across to the remote end, and vice-versa.我在本地进行的任何修改都会传输到远程端,反之亦然。 The usual mode of operation is to ask for confirmation of all transfers;通常的操作模式是要求确认所有转账; you can turn that off, but I find it handy as a check to make sure I changed what I think I changed.您可以将其关闭,但我发现它可以方便地检查以确保我更改了我认为我更改的内容。

So, my usual workflow is:所以,我通常的工作流程是:

  • Edit files locally on my development machine.在我的开发机器上本地编辑文件。
  • Run "unison" to synchronize those edits up to the build server.运行“一致”以将这些编辑同步到构建服务器。
  • In an ssh connection to the build server, run the compiler.在与构建服务器的 ssh 连接中,运行编译器。
  • Also in that ssh connection, run the program, producing an output file.同样在 ssh 连接中,运行程序,生成 output 文件。 (This is of course a little different from your situation.) (这当然和你的情况有点不同。)
  • Run "unison" again to synchronize the changed output file back to my development machine.再次运行“unison”,将更改后的 output 文件同步回我的开发机器。 (You'd be synchronizing the compiled program here.) (您将在此处同步已编译的程序。)
  • Look at the output results on my development machine.在我的开发机上看output结果。

It's not quite as fast as the edit-compile-run loop on a local machine, but I find that it's still fast enough not to be annoying.它不如本地机器上的编辑-编译-运行循环那么快,但我发现它仍然足够快,不会令人讨厌。 And it's much less heavyweight than using source control as an intermediary;而且它比使用源代码管理作为中介要轻得多。 you don't need to check in every edit you make and record it for posterity.您无需检查所做的每一次编辑并记录下来以备后用。

Also, Unison has the advantage of working pretty well across platforms;此外,Unison 还具有跨平台运行良好的优势; you can use it on Windows (most easily with Cygwin, though that's not required), and it can either tunnel over an SSH connection if you run an SSH server on your Windows machine, run its own connection service on the build server, or simply use a Windows file share and treat the build server as a "local" file. you can use it on Windows (most easily with Cygwin, though that's not required), and it can either tunnel over an SSH connection if you run an SSH server on your Windows machine, run its own connection service on the build server, or simply使用 Windows 文件共享并将构建服务器视为“本地”文件。 (Or you could put the server-side files on a Linux-based Samba share in the server farm, and mount that on your Windows build VMs; that may be easier than having "local" files in the VMs.) (或者您可以将服务器端文件放在服务器场中基于 Linux 的 Samba 共享上,然后将其挂载到 Windows 构建的 VM 上;这可能比在 VM 中拥有“本地”文件更容易。)

Edit: Actually, this is sort of a modification of option 2 in littleadv's discussion of file transferring;编辑:实际上,这是 littleadv 关于文件传输的讨论中选项 2 的一种修改; it takes the place of editing the files directly on the server via Samba/NFS shares.它取代了通过 Samba/NFS 共享直接在服务器上编辑文件。 And it works reasonably well in parallel with that -- I find that having a local cache of the files is ideal and avoids network-lag issues when working remotely, but other engineers at my company prefer something like sshfs (and, of course, on-site using Samba or NFS is fine).并且它与此并行工作得相当好——我发现拥有文件的本地缓存是理想的,并且在远程工作时可以避免网络延迟问题,但我公司的其他工程师更喜欢像 sshfs 之类的东西(当然,在- 使用 Samba 或 NFS 的站点很好)。 It all produces the same result from the point of view of the build server.从构建服务器的角度来看,这一切都会产生相同的结果。

I'm not sure I understand what you mean, but I'll try to answer what I think that the question is:-)我不确定我是否理解您的意思,但我会尝试回答我认为的问题是:-)

First of all, you're talking about cross-compilers, right?首先,你说的是交叉编译器,对吧? You're compiling on one system a code to be run on another system.您正在一个系统上编译要在另一个系统上运行的代码。

Second, you look for a "floating" license model, instead of having a dedicated compiler license per developer.其次,您寻找“浮动”许可证 model,而不是为每个开发人员提供专用的编译器许可证。

Third, you're looking to have a build machine where everyone will compile, instead of each developer compiling on his own machine.第三,您希望拥有一台每个人都可以编译的构建机器,而不是每个开发人员都在自己的机器上编译。

These issues are not the same.这些问题并不相同。 I'll try to cover them:我会尝试覆盖它们:

  1. Cross compilers - some are free, some are licensed.交叉编译器 - 有些是免费的,有些是许可的。 Some come with IDE, some are just command line compilers that can be integrated into Eclipse/VS/SlickEdit/vi/whatelse.有些带有 IDE,有些只是可以集成到 Eclipse/VS/SlickEdit/vi/whatelse 中的命令行编译器。 I don't know which one you're using, so let's take a look at Tornado (VxWorks compiler).不知道你用的是哪一个,我们来看看 Tornado(VxWorks 编译器)。 It has it's own horrible IDE, but can be integrated into others (I've used SlickEdit with it's project files directly, works like a charm).它有自己可怕的 IDE,但可以集成到其他人中(我直接将 SlickEdit 与它的项目文件一起使用,就像一个魅力一样)。 The Tornado compiler requires a license and has several different models, so we'll look at it for the next two points. Tornado 编译器需要许可证并且有几种不同的模型,因此我们将在接下来的两点中查看它。

  2. Floating licenses.浮动许可证。 Tornado, as an example, can come with either single license per installation model, or a floating license which will allocate licenses per request.例如,Tornado 可以带有每个安装的单个许可证 model,或者可以根据请求分配许可证的浮动许可证。 If you're using a build machine - you'll need either a single license (in this case you can only run one instance at a time, which defeats the purpose), or floating license to run several instances at a time.如果您使用的是构建机器 - 您将需要一个许可证(在这种情况下,您一次只能运行一个实例,这违背了目的),或者一次运行多个实例的浮动许可证。 Some cross compilers/libraries don't require licenses at all (various GCC flavors for example).一些交叉编译器/库根本不需要许可证(例如各种 GCC 风格)。

  3. Build machine - I've experienced using the VxWorks Tornado both as a dedicated compiler on my PC, and as a build-machine installation.构建机器 - 我体验过将 VxWorks Tornado 用作 PC 上的专用编译器和构建机器安装。

For a build machine you need a way to pass the code to build.对于构建机器,您需要一种方法来传递代码来构建。 That is a problem #2 for you:这对你来说是一个问题#2:

2) How / when to transfer the source code to the server to build. 2) 如何/何时将源代码传输到服务器进行构建。

Sharing over the network is not a good idea as the network latency will make the compilation times unbearable.通过网络共享不是一个好主意,因为网络延迟会使编译时间难以忍受。 Instead, do one of these:相反,请执行以下操作之一:

  1. Install the source control on the build machine, have the developers pass the code through the source control.在构建机器上安装源代码控制,让开发人员通过源代码控制传递代码。 That poses the risk of trashing the source control, so what we did was this:这带来了破坏源代码控制的风险,所以我们所做的是:

  2. All the developer's checked out files on the build machine directly (a big UNIX system with a lot of storage), and each developer would edit the files using the network share (SAMBA or NFS), which, on the 1GB company LAN was fine, and compile locally on the build machine.所有开发人员直接在构建机器上签出文件(一个具有大量存储空间的大型 UNIX 系统),每个开发人员将使用网络共享(SAMBA 或 NFS)编辑文件,这在 1GB 公司 LAN 上很好,并在构建机器上本地编译。 Some would edit directly on the Unix system using the vi/emacs/Unix version of Tornado IDE, which I hated.有些人会使用我讨厌的 Tornado IDE 的 vi/emacs/Unix 版本直接在 Unix 系统上进行编辑。 That also answers your problem #1:这也回答了你的问题 #1:

1) Networking to a virtual Windows machine. 1) 与虚拟 Windows 机器联网。

(It doesn't have to be a virtual Windows machine, Linux can work too if you have the cross-compiler from Linux to your embedded system). (它不必是虚拟的 Windows 机器,如果你有从 Linux 到你的嵌入式系统的交叉编译器,Linux 也可以工作)。

Hope that helps.希望有帮助。

I'm no expert here, but would it be possible to create a virtual machine for every target environment.我不是这里的专家,但是否有可能为每个目标环境创建一个虚拟机。 Then a developer could start the needed VM image on his local machine.然后开发人员可以在他的本地机器上启动所需的 VM 映像。

It seems that what you are trying to do is a " distributed build " where there is only a single build server.看来您正在尝试做的是“分布式构建”,其中只有一个构建服务器。 This may be possible with something like CMake .这可能通过CMake 之类的东西来实现。 However while that may "economise" your use of compiler licences, for many tool-chains the single-user licence also (or in some cases exclusively) applies to the debugger;然而,虽然这可能会“节省”您对编译器许可证的使用,但对于许多工具链来说,单用户许可证也(或在某些情况下专门)适用于调试器; it may not be particularly useful if your developers cannot debug and test their code.如果您的开发人员无法调试和测试他们的代码,它可能不是特别有用。

One solution is perhaps to use a single machine with the necessary development tools, and target hardware, and access it from multiple workstations via Remote desktop, or even Telnet if you only need a command line interface.一种解决方案可能是使用具有必要开发工具和目标硬件的单台机器,并通过远程桌面从多个工作站访问它,如果您只需要命令行界面,甚至可以使用 Telnet。 Remote Desktop will only allow one user access at a time, but multiple simultaneous access will probably be contrary to the EULA in many cases anyway.远程桌面一次只允许一个用户访问,但在许多情况下,多个同时访问可能会违反 EULA。

An DIY solution is to create your own TCP/IP app that takes build commands and files, executes the local compiler or linker and returns the results (build log, and/or object file etc.). DIY 解决方案是创建您自己的 TCP/IP 应用程序,该应用程序接受构建命令和文件,执行本地编译器或 linker 并返回结果(构建日志和/或 object 文件等)。

It may be possible to avoid the problem altogether by moving all your development to open-source tools such as GCC or SDCC;通过将所有开发转移到开源工具(例如 GCC 或 SDCC),可以完全避免这个问题; that would depend on what targets you need to support.这将取决于您需要支持的目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 大多数嵌入式C编译器如何为内存映射的I / O定义符号? - How do most embedded C compilers define symbols for memory mapped I/O? 如何从Unix命令行安装c和c ++编译器,然后与Eclipse一起使用? - How to install c and c++ compilers from Unix command line and then use with Eclipse? 如何在最新的编译器中使用仅C功能? - How to use C only features in latest compilers? 如何在 C 的编译时使用外部数组的大小? - How can I use the size of an external array at compile time in C? Ubuntu Desktop 是否附带 C 包和编译器? 如何以及在哪里可以检查所有可用的 C 接头? - Is Ubuntu Desktop shipped with C packages and compilers ? How and where can I check all the available C headers? 如何在不指定 Unix 中所有 C 编译器的位置的情况下为程序配置指定一个文件的位置? - How can I specify the location of one file for program configuration without specifying the location for all C compilers in Unix? 我可以为所有Linux编译器使用一个Linux .so吗? - Can I use one Linux .so for all Linux compilers? 如何链接嵌入在 ac/c++ 应用程序中的 python - How can I link python embedded in a c/c++ application 如何在C中运行外部程序? - how can I run an external program In C? 如何通过多处理在单独的Python进程中使用包装有Cython的外部C库? - How can I use an external C library wrapped with Cython in a separate Python process via multiprocessing?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM