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

sfj*_*jac 5 c++ eclipse eclipse-cdt

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

我知道有关C/C++项目设置的导出/导入.但是,这似乎只能为C++编译提取包含路径和#defines.它不导出完整的设置(编译器选项,警告设置,链接器选项,库,库路径......)这一事实确实限制了它的实用性.

此外,您必须为每个运行配置单独执行此操作,但这只是一个小小的不便.

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

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


UPDATE

我已经尝试过创建一个插件项目,但如果您之前没有这样做,那么这些说明会留下一些不足之处.我当然想知道如何做到这一点.

我以一些非常简单的方式复制和修改了示例模板,只是为了开始,但是"如何使用CDT注册项目模板"指令从一开始就让我失望:"1.从Eclipse创建一个空的插件项目没有源文件夹的工作台." 我认为这需要安装PDE,我做了,但后来我迷路了.我尝试了"文件/新建/插件项目",取消选择"创建Java项目"(我假设这是"空"的意思).这创建了一个仍然包含大量内容的项目.然后,我按照步骤2中的描述创建了子目录,但无法弄清楚如何在Eclipse中显示这些子目录,因此我无法在步骤11中浏览到模板XML文件.此外,在步骤9中/ 10,我没有得到'字面名称'的模板

Jon*_*ham 5

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

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

请注意,如果您最初创建插件以安装为非打包插件,则可以对其进行编辑,添加新模板或编辑已完成的模板.

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

一步步

逐步完成此过程(在安装了CDT和插件开发工具的Eclipse Mars.1上测试,另外还有用于编辑template.xml的XML编辑器)

  1. 创建插件项目(File| New| Other...| Plug-in project)

步骤1

  1. 填写项目名称并按Next/ Finish完成

第2步

您现在应该在磁盘上的文件在您创建的项目中看起来像这样:

$ 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
Run Code Online (Sandbox Code Playgroud)
  1. 打开plug-in.xml并执行以下操作
    1. 选择Extensions选项卡
    2. 按添加
    3. 输入扩展点 org.eclipse.cdt.core.templates
    4. 取消选中该Show only extension points [...]复选框
    5. org.eclipse.cdt.core.templates从列表中选择
    6. Finish
    7. Yes添加依赖

第3步

  1. 将所需的设置添加到plugin.xml屏幕截图中,并在plugin.xml代码示例中给出.

第4步

<?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>
Run Code Online (Sandbox Code Playgroud)
  1. 现在使用以下内容template.xmlplugin.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>
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 启动Eclipse Application进行测试(Run菜单| 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
Run Code Online (Sandbox Code Playgroud)

棘手的部分?

您可能需要检查.cproject基础项目中的文件,以确定id字段中的魔术字符串.例如,在我看来.cproject,-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"/>
Run Code Online (Sandbox Code Playgroud)

这转换为以下命令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>
Run Code Online (Sandbox Code Playgroud)

id从gnu.c.compiler.option.warnings.extrawarn.176373860regexp 转到.*compiler\.option\.warnings\.extrawarn.*.开头是.*这样的,这适用于C和C++编译器选项,因为C++ id已经开始了gnu.cc.compiler[...],我摆脱了最后.*因为数字和后缀在你不知道template.xml

下一步

完成后,请参阅启动Eclipse插件模板,了解如何将插件导出到正在运行的Eclipse中.