使用与另一个项目

时间:2015-10-13 01:32:37

标签: c++ eclipse eclipse-cdt

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

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

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

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

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

更新

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

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

2 个答案:

答案 0 :(得分: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
  2. step 1

    1. 填写项目名称并按Next / Finish直至完成
    2. step 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
      
      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添加依赖
      2. step 3

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

          <?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.xmlplugin.xml)中指定的位置创建template/template.xml
          2. <?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
            2. 中所需的任何内容添加模板中列出的源文件

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

              $ 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 Application以进行测试(Run菜单| Run As | Eclipse Application)。您也可以右键单击该项目,然后选择Run As | Eclipse Application

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

              3. new project wizard

                运行构建显示新设置(错误是预期的,因为我实际上没有名为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 -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转到regexp .*compiler\.option\.warnings\.extrawarn.*。开头是.*,所以这适用于C和C ++编译器选项,因为C ++ id将以gnu.cc.compiler[...]开始,我用.*删除了结尾,因为数字和后缀是template.xml

                中您不知道

                后续步骤

                完成后,请参阅Launching Eclipse plug in template了解如何将插件导出到正在运行的Eclipse中。

答案 1 :(得分:3)

我喜欢乔纳的回答,这是非常有益的。最近我一直在使用Ease和Py4J用我需要的cdt设置自动重新创建大量项目。我只想提一下这种自动化的另一种可行方法。

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

  2. 文件 - &gt;导入 - &gt; Gneral-&gt;现有项目 - &gt;选择模板项目目录

  3. 选择“将项目复制到工作区”选项

  4. 完成

  5. (可选)重命名项目,这样当您再次将项目作为新项目导入时,将不会出现命名冲突