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

前端 未结 2 349
抹茶落季
抹茶落季 2020-11-30 13:06

Is there a straightforward way to create a new C++ project that clones the settings of an existing project? When developing C++, I like to write many small tests and example

2条回答
  •  一整个雨季
    2020-11-30 13:53

    CDT has a complete Templating mechanism for creating new projects.

    Basically, you extend the org.eclipse.cdt.core.templates extension point and that points to a template.xml file that has a bunch of commands you can do. You don't need to write any Java code for this, but you do need to create a Plug-in project.

    The kinds of things you can do:

    • Create folders
    • Add files to a project
    • Set Managed Build settings (this is the one most relevant because you can set compiler options and add libraries, etc)
    • Add extra pages to the New Project Wizard to prompt user for extra information

    The Eclipse documentation has a special section giving a run down on how to do it here: http://help.eclipse.org/mars/topic/org.eclipse.cdt.doc.isv/guide/projectTemplateEngine/index.html

    The Hello World project that comes with CDT has its template here: https://github.com/eclipse/cdt/blob/master/build/org.eclipse.cdt.managedbuilder.gnu.ui/templates/projecttemplates/HelloWorldCAnsiProject/template.xml

    A little note, if you initially create your plug-in to install as a non-packed plug-in, you can edit it in place, adding new templates or editing the one you have already done.

    Going further, you can share this template plug-in project with your team and all benefit from having this feature.

    Step-by-step

    The step by step process to do this (tested on Eclipse Mars.1 with CDT and Plug-in development tools installed plus an XML editor for editing the template.xml)

    1. Create a Plug-in project (File | New | Other... | Plug-in project)

    1. Fill in a project name and press Next / Finish until done

    You should now have files on your disk that looks like this in the project you created:

    $ 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. Select the Extensions tab
      2. Press Add
      3. Type the extension point org.eclipse.cdt.core.templates
      4. Un-check the Show only extension points [...] checkbox
      5. Select the org.eclipse.cdt.core.templates from the list
      6. Press Finish
      7. Say Yes to adding dependency

    1. Add the required settings to the plugin.xml as shown in the screenshot and given in the plugin.xml code sample after.

    
    
    
       
          
       
    
    
    1. Now create the template.xml in the location specified in the plugin.xml (template/template.xml) with these contents:
    
    
    
    1. Add the source file listed in the template with any content you want in template/src/basename.c

    You should now have a directory structure that looks like this:

    $ 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. Launch the Eclipse Application to test (Run menu | Run As | Eclipse Application). You can also right-click on the project and choose Run As | Eclipse Application.

    2. In the newly running Eclipse, start a new project wizard and select your new C project type:

    Running a build shows the new settings (the error is expected as I don't actually have a library called 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
    

    The tricky part?

    You may need to examine the .cproject file from your base project to determine the magic strings that go in the id fields. For example, in my .cproject for -Wextra I can see this:

    That translates to this command in the template.xml:

    
    
        
        
            
                
                
                
            
        
    
    

    The id goes from gnu.c.compiler.option.warnings.extrawarn.176373860 to regexp .*compiler\.option\.warnings\.extrawarn.*. The beginning is .* so that this applies to C and C++ compiler options as the C++ id would have started with gnu.cc.compiler[...] and I get rid of the end with .* because the number and suffix is not known to you in the template.xml

    Next steps

    When you are done, see Launching Eclipse plug in template for how to export the plug-in into your running Eclipse.

提交回复
热议问题