Netbeans C++ makefile 环境变量

6
我有一个简单的makefile,调用C++编译器作为$(CXX),这个变量在我的~/.profile脚本中设置。Netbeans似乎有一个复杂的工具链管理器,但不管怎样,它都会将$CXX解析为c++
如何正确设置$CXX,或者Netbeans设置了另一个变量,可以被我的makefile检测到?(糟糕)
编辑:右键单击导航器中的makefile,允许我指定一个环境,尽管只有一行输入的空间。指定CXX=/usr/local/bin/g++可以解决问题,但这远非最佳选择。

您可以指定每个文件的编译选项,因此如果您右键单击一个文件,您可以将其指定为 c 文件或 c++ 文件... 要选择编译器,您需要制作一个“工具包”。 - Mikhail
@Mikhail 这是一个自定义的 makefile,因此 Netbeans 无法针对每个文件执行任何操作。 - Potatoswatter
也许你可以更改你的 makefile?另外,你对 makefile 进行了自定义调用,但我认为你需要选择正确的“工具集”。 - Mikhail
@Mikhail 是的,这个问题是关于我如何正确选择工具集或更改makefile以反映工具集。 - Potatoswatter
我遇到了类似的问题 - make命令无法获取在我的bash_profile中设置的环境变量。在makefile之外,它们已经被设置,并且可以通过echo $VARIABLE来显示,但是在makefile内部,$(info $VARIABLE)却只打印出一个空行。有何解决办法吗? - Michel Müller
好的,我解决了:我忘记在bash_profile中那一行前面加上“export”。我还将bash_profile中的所有初始化放入bashrc中,并从profile脚本中源化它们,以便为非交互式shell准备变量(不确定GNU Make是否需要这样做)。 - Michel Müller
3个回答

3

我将简单描述一下我在NetBeans中使用C++时通常的做法。首先,对于每个项目,我会创建一个简单的makefile,如下所示:

MAIN = <my main target>
CFLAGS = -g -std=c++0x

include ${MAKELIBHOME}/MINGW32.inc
include ${MAKELIBHOME}/WINDOWS.inc

build: ${MAIN}

clean:; rm -fr <files to remove>

环境变量MAKELIBHOME在NetBeans之外设置。目录${MAKELIBHOME}包含一些用于make的include文件,例如MINGW32.inc文件的内容如下:

CC = g++

CFLAGS += -W -DLITTLE_ENDIAN=1
LDLIBS += -lws2_32

.SUFFIXES: .o .c .cpp

.c:     ;${CC} ${CFLAGS} ${LDFLAGS} $< -o latest ${LDLIBS}
.cpp:   ;${CC} ${CFLAGS} ${LDFLAGS} $< -o latest ${LDLIBS}

.c.o:   ;${CC} ${CFLAGS} -c $<
.cpp.o: ;${CC} ${CFLAGS} -c $<

这些inc文件对于所有NetBeans项目都是相同的。这里没有绝对路径,因此make将使用PATH变量来定位GCC工具集,但是您当然可以使用绝对路径来选择您喜欢的工具集(或包含不同的inc文件-我更喜欢这种方式)。
所有这些都在我的Windows机器上运行,但Linux配置看起来非常相似-我只需要将另一组inc文件包含到所有主要的makefiles中即可。此外,这个设置允许我从命令行调用make。
希望能帮助到您, ~ AY

哦,你发帖时我错过了。我不再使用NetBeans了,但我的问题是关于“环境变量MAKELIBHOME在NetBeans之外设置”的。你是如何使外部环境变量对NetBeans可见的?虽然,由于我使用Unix/OS X,这可能无法转换。 - Potatoswatter
@Potatoswatter - make 命令在 Windows 和 Unix 系统中都可以参考环境变量,并且它是在 NetBeans 之外执行的。顺便说一句,我总是使用 NetBeans 项目类型 "C/C++ Project With Existing Sources",所以我的 Makefile 是完全受我控制的。 - HEKTO
好的,正如问题所述,我的.profile设置了$CXX,但该变量在makefile中不可用。调用make的程序负责创建环境,尽管默认情况下变量会传播。 - Potatoswatter
我再次查看了我的makefile文件 - 因此,我的旧Windows XP系统上的makefile文件确实引用了已经设置(交互式)的“MAKELIBHOME”环境变量。然而,我的新Ubuntu系统上的makefile文件在其中分配了“MAKELIBHOME”变量。实际上,我在所有的makefile文件中都有一个“ifeq (${OS},Windows_NT)”条件语句,以使这种分支自动化。所以 - 你是对的,在Unix上的NetBeans行为不同。 - HEKTO

2
这是一篇较旧的文章。然而,最近我遇到了相同的问题,并找到了一种基于@HEKTO答案的替代方法。
我使用PETSc,这是一个用于求解大型稀疏矩阵系统的库。它们的构建系统要求您在makefile中使用"include",该文件取决于两个环境变量:PETSC_DIR和PETSC_ARCH,这些变量必须在您的环境中设置... 或者您可以将它们作为选项传递给您的make命令!这就是我所做的。
我使用NetBeans生成的makefile,并在末尾添加了我的include。
include ${PETSC_DIR}/conf/variables

请注意,这取决于PETSC_DIR的定义。此外,此包含文件在很多地方大量使用PETSC_ARCH和它们。
因此,在NetBeans中,现在我配置它将这些变量传递给make: 工具->选项:在“项目选项”选项卡中,我填写“Make选项”的文本框为:PETSC_DIR=/path/to/petsc PETSC_ARCH=some-arch
此外,现在您可以在项目选项中使用这些环境变量(以及在${PETSC_DIR}/conf/variables中定义的其他变量)。例如,对于我的包含文件,我执行以下操作(右键单击项目,然后选择“属性”): 在“C编译器”下,“包含目录”中输入:${PETSC_DIR}/include 在“链接器”下,“库”中输入:${PETSC_LIB}(在上面的包含文件中定义)。
现在我可以从NetBeans中构建和运行我的项目。如果我的PETSc版本更改,则只需要更改传递给make的变量的定义,然后解决所有其他问题。
我希望这可能有助于某些人。对我确实有效。好处是我可以将我的代码提供给其他人,他们可以像往常一样使用“make”从命令行编译(不使用NetBeans),并定义上述环境变量。编译现在没有任何硬编码路径。

1

我在Linux上遇到了一个非常类似的问题,Netbeans没有从bash中获取环境变量。

解决方案:从bash启动Netbeans。

我不确定在Mac上的等效方法是什么,但思路很简单:从已经设置正确环境变量的终端启动Netbeans。


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