在Eclipse中设置构建输出目录 - c++

12
我有一个程序,在Ubuntu下用eclipse编写(使用C++语言),该程序包含多个项目。这些项目包括一个主执行文件以及其他共享对象文件和静态库。
我希望所有这些项目在构建时将它们的文件输出到一个共同的二进制文件夹中,而不是它们各自的debug文件夹。这样做是为了更容易地与主执行文件进行链接。如果有更好的解决方案,请随意分享。
6个回答

13

很遗憾,我发现在 C/C++ Build 选项卡下,除非你创建自己的 makefile,否则无法设置构建位置。

你可能已经发现,在默认的 C/C++ 项目中,项目属性>C/C++ Build 下的 构建器设置 选项卡全部被禁用了。这是因为 CDT 默认为新项目指定了内部构建器。要更改这个设置,可以转到 项目属性>C/C++ Build>工具链编辑器 并将 当前构建器 更改为 Gnu Make Builder。然后,转到 项目属性>C/C++ Build 并将 构建器类型 更改为 外部构建器。如果愿意,您现在可以选择为项目创建自己的 makefile;不过我建议暂时让 CDT 自动构建 makefile。

我有同样的项目需求,需要将输出放置在 /project_path/bin 目录下(尽管我仍然保持 Debug 和 Release 构建之间的分离)。要实现此目标,我会将输出复制到后处理步骤中。

为此,请转到项目属性>C/C++ Build>设置 并选择 构建步骤 选项卡。在 后处理步骤 下的 命令: 中,输入:

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目录中,并在任何后续重建时被覆盖。


有一个后构建步骤的选项,所以最简单的方法是让它在原地构建,如果可以的话,使用后构建步骤来复制/移动/链接它。是否有一个特殊的宏用于调试或发布,以便我可以为两个配置使用一个通用的宏? - CashCow

6

尝试点击 项目->属性

C/C++构建->设置 下,你会看到一个名为 构建产物 的标签页。

在那里,你会看到一个名为 产物名称 的选项。默认情况下,它是 ${ProjName}

修改这个选项,以指定一个相对目录路径,来存放最终生成的文件。因此可以写成 ../../lib/${ProjName}

中间文件(.o和.d)仍然会被构建到子目录(Debug或Release)中,但是如果只是最终生成的库需要更改构建路径,那么最好将它们放在那里。

如果你觉得手动输入相对路径很麻烦,可以使用环境变量来创建相对路径,从而返回到“根”目录。我通常使用${LIBDIR}作为其中一个环境变量,它是从项目构建路径开始的相对路径。它通常用于链接其他库,但也可以用作目标路径。然后你只需要将产物名称设置为${LIBDIR}/${ProjName},这样就可以轻松处理调试和发布版本的不同目录了。


1
这没有任何影响。使用Luna 4.4.0版本,我可以更改可执行文件的名称,但路径部分被忽略了。 - truthseeker
我也试过了,谢谢! ${workspace_loc:MyProject}/_runtime/${ProjName} - macroland

4

前往

项目属性 -> C/C++ 构建 -> 设置 -> (选项卡) GCC C++ 链接器

命令行模式显示在右侧

${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

该链接无法访问。

2
在我的项目中,构建路径默认为Build配置名称,因此我可以使用${ConfigName}宏在后期构建步骤中检索构建路径:
${workspace_loc:/${ProjName}}/${ConfigName}/${BuildArtifactFileName}

然后,您可以将目标二进制文件复制到您的公共二进制文件夹中,或在该特定配置的构建文件夹中执行其他操作。


0

恰好我正在处理一个类似的问题,所以我将提供另一种解决方案/提醒自己:

在Eclipse(至少在Luna版本中),生成的makefile实际上相当不错和方便。我个人喜欢创建几个构建配置(32位和64位架构的发布和调试变体),并用调试和运行(分别是F5和执行)配置来补充它们。

继续:我一直在玩Debian的打包,并在这个过程中发现我需要创建和测试一个安装目标。Eclipse既不为您生成,也不提供界面来自定义或添加安装目标;除了一个可以指定其他目标存在的地方之外。

因此,从技术上讲,Eclipse确实提供了一个界面;有点像。因此,我偶然发现了makefile.initmakefile.defsmakefile.targets文件。

流程/工作流程:

  • 在您的Eclipse项目的根目录中创建一个名为makefile.targets的文件;在该文件中手动定义一个安装目标。这当然允许您指定每一个细节,但同时也可以利用Eclipse提供的所有配置来定义指定目标的规则。

  • makefile.targets文件中定义新目标后,在Eclipse的project explorer右键单击您的项目名称或主cpp文件,然后选择Make Targets->Build...,最后点击Add以实例化一个弹出窗口。或者,您也可以在最后一步选择“create”而不是“build”,它将提供下一部分所需的相同弹出窗口。添加您的新目标名称,并将其他所有内容保留为默认值,然后点击ok

  • 如果您选择通过在Project Explorer右键单击并选择Make Target->Build...来添加新的构建目标,则在添加新的构建目标后,您将返回到由选择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)

0
如果您打开项目属性,会看到一个标签C/C++ Build。其中有一个“构建位置”选项,您可以指定构建目录。您似乎可以更改此选项,使多个项目共享同一构建目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接