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

Creating a new C++ Project in Eclipse CDT with the same settings as another project

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

我知道 Export/Import 的 C/C++ 项目设置。但是,这似乎只包含 C++ 编译的包含路径和#defines。它不会导出完整的设置(编译器选项、警告设置、链接器选项、库、库路径……)这一事实确实限制了它的用处。

此外,您必须为每个 运行 配置单独执行此操作,尽管这会带来一些不便。

我通常采用的是复制一个测试项目并手动编辑 .project.cproject 文件,然后对文件进行核对和替换。但这似乎是一个容易出错的 hack。

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


更新

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

我以一些非常简单的方式复制并修改了示例模板,只是为了开始,但是 "How to register a project template with CDT" 说明从一开始就让我迷失了方向:“1. 从 Eclipse 创建一个空的插件项目workbench 没有源文件夹。”我假设这需要安装 PDE,我确实这样做了,但后来我迷路了。我尝试了 "File / New / Plug-in Project",取消选择了 "Create a Java Project"(我假设这就是 "Empty" 的意思)。这创建了一个项目,其中仍然有很多东西。然后我按照步骤 2 中的描述创建了子目录,但无法弄清楚如何让这些子目录显示在 Eclipse 中,因此我无法浏览到步骤 11 中的模板 XML 文件。另外,在步骤 9/10 中,我没有得到模板 'literally named "(template)"' - 而是创建了一个包含我的模板项目全名的模板。

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

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

您可以做的事情种类:

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

Eclipse 文档有一个特殊部分给出了 运行 如何在此处执行此操作的说明: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.managedbuilder.gnu.ui/templates/projecttemplates/HelloWorldCAnsiProject/template.xml

请注意,如果您最初创建 plug-in 作为 non-packed plug-in 安装,您可以就地编辑它,添加新模板或编辑您已有的模板已经完成了。

更进一步,您可以与您的团队共享这个模板 plug-in 项目,所有人都可以从这个功能中获益。

Step-by-step

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

  1. 创建一个 Plug-in 项目 (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. 打开 plug-in.xml 并执行以下操作
    1. Select Extensions 选项卡
    2. 按添加
    3. 输入扩展点org.eclipse.cdt.core.templates
    4. Un-check Show only extension points [...] 复选框
    5. Select 列表中的 org.eclipse.cdt.core.templates
    6. Finish
    7. 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. 现在在 plugin.xml (template/template.xml) 中指定的位置创建 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 "
    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 菜单 | Run As | Eclipse Application)。您也可以在项目上 right-click 并选择 Run As | Eclipse Application.

  2. 在新的 运行ning Eclipse 中,启动一个新项目向导和 select 你的新 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

中不为您所知

后续步骤

完成后,请参阅 了解如何将 plug-in 导出到 运行ning Eclipse。

我喜欢 Jonah 的回答,信息量很大。最近我一直在使用 Ease 和 Py4J 自动重新创建大量具有我需要的 cdt 设置的项目。我只想提一下实现这种自动化的另一种可能方式。

  1. 创建您的模板项目,将其存储在某个工作区中,不一定需要与您要导入的项目位于同一工作区中

  2. File->Import->Gneral->Existing Projects->Select你的模板项目目录

  3. Select "Copy projects into workspace" 选项

  4. 完成

  5. 可选地重命名项目,这样当你再次将项目作为新项目导入时,不会有命名冲突