使用与另一个项目相同的设置在 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)
- 创建一个 Plug-in 项目 (
File
| New
| Other...
| Plug-in project
)
- 填写项目名称并按
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
- 打开 plug-in.xml 并执行以下操作
- Select
Extensions
选项卡
- 按添加
- 输入扩展点
org.eclipse.cdt.core.templates
- Un-check
Show only extension points [...]
复选框
- Select 列表中的
org.eclipse.cdt.core.templates
- 按
Finish
- 说
Yes
添加依赖
- 将所需的设置添加到
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>
- 现在在
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>
- 在模板中添加您想要的任何内容的源文件
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
启动 Eclipse 应用程序进行测试(Run
菜单 | Run As
| Eclipse Application
)。您也可以在项目上 right-click 并选择 Run As
| Eclipse Application
.
在新的 运行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 设置的项目。我只想提一下实现这种自动化的另一种可能方式。
创建您的模板项目,将其存储在某个工作区中,不一定需要与您要导入的项目位于同一工作区中
File->Import->Gneral->Existing Projects->Select你的模板项目目录
Select "Copy projects into workspace" 选项
完成
可选地重命名项目,这样当你再次将项目作为新项目导入时,不会有命名冲突
有没有直接的方法来创建一个新的 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)
- 创建一个 Plug-in 项目 (
File
|New
|Other...
|Plug-in project
)
- 填写项目名称并按
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
- 打开 plug-in.xml 并执行以下操作
- Select
Extensions
选项卡 - 按添加
- 输入扩展点
org.eclipse.cdt.core.templates
- Un-check
Show only extension points [...]
复选框 - Select 列表中的
org.eclipse.cdt.core.templates
- 按
Finish
- 说
Yes
添加依赖
- Select
- 将所需的设置添加到
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>
- 现在在
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>
- 在模板中添加您想要的任何内容的源文件
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
启动 Eclipse 应用程序进行测试(
Run
菜单 |Run As
|Eclipse Application
)。您也可以在项目上 right-click 并选择Run As
|Eclipse Application
.在新的 运行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
后续步骤
完成后,请参阅
我喜欢 Jonah 的回答,信息量很大。最近我一直在使用 Ease 和 Py4J 自动重新创建大量具有我需要的 cdt 设置的项目。我只想提一下实现这种自动化的另一种可能方式。
创建您的模板项目,将其存储在某个工作区中,不一定需要与您要导入的项目位于同一工作区中
File->Import->Gneral->Existing Projects->Select你的模板项目目录
Select "Copy projects into workspace" 选项
完成
可选地重命名项目,这样当你再次将项目作为新项目导入时,不会有命名冲突