【发布时间】:2011-06-20 09:56:26
【问题描述】:
我有一个程序,它由 eclipse 中的多个项目组成(在 ubuntu 下工作,项目在 c++ 中),这些项目由一个主可执行文件、其他共享对象文件和静态库组成。
我希望所有这些项目在构建时将它们的文件输出到一个公共二进制文件夹,而不是它们各自的调试文件夹。这是为了使与主可执行文件的链接更容易。如果有更好的解决方案也欢迎分享。
【问题讨论】:
我有一个程序,它由 eclipse 中的多个项目组成(在 ubuntu 下工作,项目在 c++ 中),这些项目由一个主可执行文件、其他共享对象文件和静态库组成。
我希望所有这些项目在构建时将它们的文件输出到一个公共二进制文件夹,而不是它们各自的调试文件夹。这是为了使与主可执行文件的链接更容易。如果有更好的解决方案也欢迎分享。
【问题讨论】:
不幸的是,我发现 C/C++ Build 选项卡不允许您设置构建位置,除非您正在创建自己的 makefile。
您可能已经发现 Project Properties>C/C++ Build 下的 Builder Settings 选项卡在默认 C/C++ 项目中全部变灰。这是因为 CDT 默认为新项目指定内部构建器。要更改此设置,您可以转到 Project Properties>C/C++ Build>Tool Chain Editor 并将 Current Builder 更改为 Gnu Make Builder。接下来,转到 Project Properties>C/C++ Build 并将 Builder Type 更改为 External Builder。如果愿意,您现在可以选择为项目创建自己的 makefile;虽然我建议现在让 CDT 自动构建 makefile。
我有输出到 /project_path/bin 的相同项目要求(尽管我仍然保持 Debug 和 Release 构建之间的分离)。为此,我在构建后步骤中对输出执行了复制操作。
为此,请转到 Project Properties>C/C++ Build>Settings 并选择 Build Steps 选项卡。在 Command: 下的 Post-build steps 中,输入:
cp ${BuildArtifactFilePrefix}${BuildArtifactFileName} "/path/to/bin/directory/";
显然根据需要替换“/path/to/bin/directory/”。
我个人更喜欢将我的项目文件保存在 workspace/build 目录中;将二进制文件复制到 workspace/bin 目录,将库复制到 workspace/lib 目录。起初,我发现这种复制解决方法很不方便,但我开始欣赏它,因为它将插页式构建文件与最终的二进制文件/库隔离开来。
对于二进制文件,我会使用:
cp ${BuildArtifactFilePrefix}${BuildArtifactFileName} "${WorkspaceDirPath}/bin/";
对于图书馆,我会使用:
cp ${BuildArtifactFilePrefix}${BuildArtifactFileName} "${WorkspaceDirPath}/lib/";
我包含变量“${BuildArtifactFilePrefix}”,因为 CDT 包含“lib”作为静态库的默认前缀,我实际上更喜欢它。
只需要在构建之前确保目标目录存在即可; Eclipse/CDT 不会为您创建目录。
另外,请记住,这些副本在清理时将留在 /bin 或 /lib 目录中,但在任何后续重建时都会被覆盖。
【讨论】:
试试Project->Properties
在C/C++ Build->Settings 下,您有一个名为Build Artifact 的选项卡。
在下面你有Artifact name。默认为${ProjName}。
修改它以指定您实际希望最终文件结束的相对目录路径。所以可能是../../lib/${ProjName}
中间文件(.o 和 .d)仍将构建到子目录(Debug 或 Release),但我想如果它们仍然存在会更好,并且它只是您想要为其构建的最终库更改构建路径。
如果您发现这样输入相对路径不方便,我会使用 Environment 创建环境变量,并使用相对路径将我带回“根”。我拥有的其中之一是${LIBDIR},这是构建项目的相对路径。它通常用于链接其他库,但也可以用作目标。然后,您可以将 Artifact Name 设置为 ${LIBDIR}/${ProjName},如果您使用不同的目录进行调试和发布构建,这将非常有效。
【讨论】:
前往
命令行模式显示在右侧
${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX} ${OUTPUT} ${INPUTS}
放在${OUTPUT}前面
${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX} ${ProjDirPath}/bin/${OUTPUT} ${INPUTS}
或
${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX} MyMainProject/path/bin/ ${INPUTS}
来自https://www.eclipse.org/forums/index.php?t=msg&th=207500&goto=665566&#msg_665566
【讨论】:
在我的项目中,构建路径默认为构建配置名称,因此我可以使用 ${ConfigName} 宏在构建后步骤中检索构建路径:
${workspace_loc:/${ProjName}}/${ConfigName}/${BuildArtifactFileName}
然后您可以将目标二进制文件复制到您的通用二进制文件夹,或在该特定配置的构建文件夹中执行其他操作。
【讨论】:
如果你打开项目的属性,有一个选项卡 C/C++ Build。这有一个构建位置选项,您可以在其中指定构建目录。看来您可以为您的多个项目更改此设置,以便它们共享相同的构建目录。
【讨论】:
刚好在做一些让我走上类似道路的事情 - 所以我会提供它作为替代解决方案/提醒自己:
在 Eclipse 中(至少在 Luna 中)生成的 makefile 实际上相当不错且方便。我个人喜欢创建几种构建配置(具有 32 位和 64 位架构的发布和调试变体),并用调试和运行(分别为 F5 和执行)配置来补充它们。
继续:我一直在玩弄 Debian 上的打包,发现 - 在上述玩弄的过程中 - 我需要创建和测试安装目标。 Eclipse 既不为您生成,也不提供接口——配置——用于定制或添加安装目标;除了可以指定另一个目标存在的地方。
所以从技术上讲,Eclipse 确实提供了一个接口;有点。因此,我偶然发现了 makefile.init、makefile.defs 和 makefile.targets 文件。
流程/工作流程:
在你的eclipse项目根目录下创建一个文件makefile.targets;在所述文件中手动定义安装目标。 这 - 当然 - 允许您根据需要指定每一个小细节,但 Eclipse 提供的所有配置的额外好处已经完成并且可供您用于定义指定目标的规则.
在makefile.targets文件中定义新目标后,右击在Eclipse的project explorer中你的项目名或主cpp文件,然后选择Make Targets->@ 987654325@,最后是Add 来实例化一个弹出窗口。 或者,您可以在最后一步选择“创建”而不是“构建”,它将提供下一部分所需的相同弹出窗口。添加名称您的新目标 - 将其他所有内容保留为默认值 - 点击 ok
如果您选择通过在项目资源管理器中右键单击并选择Make Target来添加新的make目标->Build...,在添加新的 make 目标之后,您将返回到第一个弹出窗口,该弹出窗口是由选择 Build... .否则,立即找到Make Targets->Build.. 弹出窗口的方式。选择所需的目标,然后点击Build。
查看 Eclipse 自动生成的 makefile 是学习 makefile 语法和整体结构以及深入了解包含和条件的一些高级用法的绝佳方式。
这是一个示例 makefile 的一些部分,至少我希望它会演示手动设置构建的输出目录:
prefix = /usr/local
bindir = $(prefix)/bin
sharedir = $(prefix)/share
mandir = $(sharedir)/man
man1dir = $(mandir)/man1
...
# Typical all target
all: <binaryname>
#Typical clean target
clean:
rm -f <binaryname> <objectname>.o
# Target invokes all, then installs to specified locations
install: all
install <binaryname> $(DESTDIR)$(bindir)
install -m 0644 <objectname>.1 $(DESTDIR)$(man1dir)
【讨论】: