在 Eclipse CDT 中创建一个新的 C++ 项目,设置与另一个项目相同

2024-02-19

是否有一种简单的方法来创建克隆现有项目设置的新 C++ 项目?在开发 C++ 时,我喜欢编写许多小测试和示例,但如果我的代码依赖于外部库(就像它们经常做的那样),我必须每次都从头开始设置包含、库、编译器设置等。有某种模板机制吗?

我了解 C/C++ 项目设置的导出/导入。然而,这似乎只选取 C++ 编译的包含路径和#defines。事实上,它不导出完整的设置(编译器选项、警告设置、链接器选项、库、库路径……),这确实限制了它的实用性。

此外,您必须为每个运行配置单独执行此操作,尽管这有点不便。

我通常采取的方法是复制一个测试项目并手动编辑.project and .cproject文件,然后删除并替换文件。但这似乎是一个容易出错的黑客行为。

还有其他方法吗?我是否需要切换到单独的构建系统并在外部生成 Eclipse 项目才能拥有看起来相当基本的功能?


UPDATE

我尝试过创建一个插件项目,但如果您以前没有这样做过,那么说明中的内容还有很多不足之处。我绝对想弄清楚如何做到这一点。

我以一些非常简单的方式复制并修改了示例模板,只是为了开始,但是“如何使用 CDT 注册项目模板”说明从一开始就让我迷失了:“1. 从 Eclipse 创建一个空的插件项目没有源文件夹的工作台。”我认为这需要安装 PDE,我确实这样做了,但后来我迷失了。我尝试了“文件/新建/插件项目”,取消选择“创建Java项目”(我认为这就是“空”的意思)。这创建了一个项目,其中仍然有很多东西。然后,我按照步骤 2 中的描述创建了子目录,但不知道如何让这些子目录显示在 Eclipse 中,因此我无法在步骤 11 中浏览到模板 XML 文件。另外,在步骤 9 中/10,我没有得到一个“字面上命名为“(模板)””的模板 - 相反,它创建了一个具有我的模板项目全名的模板。


CDT 拥有完整的用于创建新项目的模板机制。

基本上,您扩展了org.eclipse.cdt.core.templates扩展点并指向template.xml文件,其中包含许多您可以执行的命令。您不需要为此编写任何 Java 代码,但需要创建一个插件项目。

您可以做的事情有:

  • 创建文件夹
  • 将文件添加到项目中
  • 设置托管构建设置(这是最相关的设置,因为您可以设置编译器选项并添加库等)
  • 向新建项目向导添加额外页面以提示用户提供额外信息

Eclipse 文档有一个特殊的部分,在这里详细介绍了如何执行此操作:http://help.eclipse.org/mars/topic/org.eclipse.cdt.doc.isv/guide/projectTemplateEngine/index.html http://help.eclipse.org/mars/topic/org.eclipse.cdt.doc.isv/guide/projectTemplateEngine/index.html

CDT 附带的 Hello World 项目的模板如下:https://github.com/eclipse/cdt/blob/master/build/org.eclipse.cdt.managementbuilder.gnu.ui/templates/projecttemplates/HelloWorldCAnsiProject/template.xml https://github.com/eclipse/cdt/blob/master/build/org.eclipse.cdt.managedbuilder.gnu.ui/templates/projecttemplates/HelloWorldCAnsiProject/template.xml

请注意,如果您最初创建插件作为非打包插件安装,则可以就地编辑它,添加新模板或编辑已完成的模板。

更进一步,您可以与您的团队共享此模板插件项目,并且所有人都可以从此功能中受益。

一步步

执行此操作的分步过程(在 Eclipse Mars.1 上测试,安装了 CDT 和插件开发工具以及用于编辑 template.xml 的 XML 编辑器)

  1. 创建一个插件项目(File | New | Other... | Plug-in project)
  1. 填写项目名称并按Next / Finish直到完成

现在,您的磁盘上应该有您创建的项目中如下所示的文件:

$ find . -type f
./.classpath
./bin/com/example/cdt/templates/Activator.class
./.project
./src/com/example/cdt/templates/Activator.java
./.settings/org.eclipse.jdt.core.prefs
./META-INF/MANIFEST.MF
./build.properties
  1. Open the plug-in.xml and do the following
    1. 选择Extensions tab
    2. 按添加
    3. 输入扩展点org.eclipse.cdt.core.templates
    4. 取消勾选Show only extension points [...]复选框
    5. 选择org.eclipse.cdt.core.templates从列表中
    6. Press Finish
    7. Say Yes添加依赖项
  1. 将所需的设置添加到plugin.xml如屏幕截图所示并在后面的plugin.xml 代码示例中给出。
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.cdt.core.templates">
      <template
            filterPattern=".*gcc"
            id="com.example.cdt.templates.template1"
            location="template/template.xml"
            projectType="org.eclipse.cdt.build.core.buildArtefactType.exe">
      </template>
   </extension>
</plugin>
  1. 现在创建template.xml在指定的位置plugin.xml (template/template.xml)包含以下内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<template type="ProjTempl" version="1.0" supplier="Stack Overflow"
    revision="1.0" author="Jonah Graham" id="EXE" label="Stack Overflow Example"
    description="An example for https://stackoverflow.com/questions/33092746/creating-a-new-c-project-in-eclipse-cdt-with-the-same-settings-as-another-proj."
    help="help.html">


    <process type="org.eclipse.cdt.managedbuilder.core.NewManagedProject">
        <simple name="name" value="$(projectName)" />
        <simple name="artifactExtension" value="exe" />
        <simple name="isCProject" value="true" />
    </process>

    <process type="org.eclipse.cdt.core.CreateSourceFolder">
        <simple name="projectName" value="$(projectName)" />
        <simple name="path" value="src" />
    </process>

    <process type="org.eclipse.cdt.core.AddFiles">
        <simple name="projectName" value="$(projectName)" />
        <complex-array name="files">
            <element>
                <simple name="source" value="src/basename.c" />
                <simple name="target" value="src/$(projectName).c" />
                <simple name="replaceable" value="true" />
            </element>
        </complex-array>
    </process>

    <process type="org.eclipse.cdt.ui.OpenFiles">
        <simple name="projectName" value="$(projectName)" />
        <complex-array name="files">
            <element>
                <simple name="target" value="src/$(projectName).c" />
            </element>
        </complex-array>
    </process>

    <!--  Set -Wall by checking the checkbox in the settings -->
    <process
        type="org.eclipse.cdt.managedbuilder.core.SetMBSBooleanOptionValue">
        <simple name="projectName" value="$(projectName)" />
        <complex-array name="resourcePaths">
            <element>
                <simple name="id" value=".*compiler\.option\.warnings\.extrawarn.*" />
                <simple name="value" value="true" />
                <simple name="path" value="" />
            </element>
        </complex-array>
    </process>

    <!--  Set -Werror by adding textual build settings -->
    <process
        type="org.eclipse.cdt.managedbuilder.core.SetMBSStringOptionValue">
        <simple name="projectName" value="$(projectName)" />
        <complex-array name="resourcePaths">
            <element>
                <simple name="id" value=".*compiler\.option\.misc\.other.*" />
                <simple name="value" value="-c -fmessage-length=0 -Werror" />
                <simple name="path" value="" />
            </element>
        </complex-array>
    </process>

    <!--  Add -lmylibname to libraries to link -->
    <process
        type="org.eclipse.cdt.managedbuilder.core.AppendToMBSStringListOptionValues">
        <simple name="projectName" value="$(projectName)" />
        <complex-array name="resourcePaths">
            <element>
                <simple name="id" value=".*link\.option\.libs.*" />
                <simple-array name="values">
                    <element value="mylibname" />
                </simple-array>
                <simple name="path" value="" />
            </element>
        </complex-array>
    </process>
</template>
  1. 添加模板中列出的源文件以及您想要的任何内容template/src/basename.c

您现在应该有一个如下所示的目录结构:

$ find . -type f
./.classpath
./template/src/basename.c
./template/template.xml
./bin/com/example/cdt/templates/Activator.class
./.project
./src/com/example/cdt/templates/Activator.java
./.settings/org.eclipse.jdt.core.prefs
./META-INF/MANIFEST.MF
./plugin.xml
./build.properties
  1. 启动 Eclipse 应用程序进行测试(Run menu | Run As | Eclipse Application)。您也可以右键单击该项目并选择Run As | Eclipse Application.

  2. 在新运行的 Eclipse 中,启动新项目向导并选择新的 C 项目类型:

运行构建会显示新设置(该错误是预期的,因为我实际上没有名为 mylibname 的库):

Building file: ../src/hello2.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -Wextra -c -fmessage-length=0 -Werror -MMD -MP -MF"src/hello2.d" -MT"src/hello2.o" -o "src/hello2.o" "../src/hello2.c"
Finished building: ../src/hello2.c

Building target: hello2
Invoking: GCC C Linker
gcc  -o "hello2"  ./src/hello2.o   -lmylibname
/usr/bin/ld: cannot find -lmylibname
collect2: error: ld returned 1 exit status
make: *** [hello2] Error 1

棘手的部分?

您可能需要检查.cproject来自您的基础项目的文件以确定进入的魔术字符串id字段。例如,在我的.cproject for -Wextra我可以看到这个:

<option id="gnu.c.compiler.option.warnings.extrawarn.176373860" name="Extra warnings (-Wextra)" superClass="gnu.c.compiler.option.warnings.extrawarn" value="true" valueType="boolean"/>

这翻译成这个命令template.xml:

<!--  Set -Wall by checking the checkbox in the settings -->
<process
    type="org.eclipse.cdt.managedbuilder.core.SetMBSBooleanOptionValue">
    <simple name="projectName" value="$(projectName)" />
    <complex-array name="resourcePaths">
        <element>
            <simple name="id" value=".*compiler\.option\.warnings\.extrawarn.*" />
            <simple name="value" value="true" />
            <simple name="path" value="" />
        </element>
    </complex-array>
</process>

id 来自gnu.c.compiler.option.warnings.extrawarn.176373860到正则表达式.*compiler\.option\.warnings\.extrawarn.*。开始是.*因此这适用于 C 和 C++ 编译器选项,因为 C++ id 将以gnu.cc.compiler[...]我摆脱了结尾.*因为您不知道号码和后缀template.xml

下一步

完成后,请参阅启动 Eclipse 插件模板 https://stackoverflow.com/questions/33124278/launching-eclipse-plug-in-template/33133450#33133450了解如何将插件导出到正在运行的 Eclipse 中。

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

在 Eclipse CDT 中创建一个新的 C++ 项目,设置与另一个项目相同 的相关文章

  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • 生成多个随机数

    我想生成 25 个唯一的随机数并将它们列在控制台中 数字的长度应至少为 10 个字符 有什么简单的方法可以做到这一点吗 尝试将数字构建为字符串 并使用 HashSet 确保它们是唯一的 Random random new Random Ha
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 对作为函数参数传递的指针使用删除

    删除作为函数参数传递的指针是否可以 并且合法 如下所示 include
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐