【问题标题】:Eclipse with MinGW does not link correctly带有 MinGW 的 Eclipse 无法正确链接
【发布时间】:2015-04-07 03:35:44
【问题描述】:

我使用 Eclipse Luna IDE for C/C++ (CDT) 和 MinGW 使用 Microsoft Windows 7 进行 C 编程。

我尝试编写一个使用KissFFT的简单程序

这不是直接的库,这只是一些 *.c 和 *.h 文件。

我的示例程序存储在 E:\Programming\Programs\Simple_FFT\

这是我的示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <tools/kiss_fftr.h>

int nfft = 1024;
int inverse_fft = 0;


int main(void) {

	kiss_fftr_cfg cfg = kiss_fftr_alloc(nfft, inverse_fft, NULL, NULL);
	kiss_fft_scalar timedata[nfft]; //input
	kiss_fft_cpx freqdata[nfft]; //output

while (1)
{

	timedata[nfft] = 0;

	kiss_fftr(cfg, timedata, freqdata);

	free(cfg);
}
return 0;
}

如您所见,我包含了kiss_fftr.h。 另一方面,这个文件包含了kiss_fft.h。

在 Eclipse 中,我转到 Properties -> C/C++ General -> Paths and Symbols -> Includes -> GNU C -> 在那里我添加了目录 E:\Programming\Libraries\kiss_fft130 和 E:\Programming\库\kiss_fft130\工具

因为这是存放需要的头文件和c文件的文件夹。

所以一切都很好,不是吗?

但现在奇怪的是:我不能用 Eclipse 编译程序。我对编程比较陌生,但据我所知,如果我包含头文件并且目录包含在 Eclipse 中,则应自动链接相关的 *.c 文件。

相反,我得到未定义的引用:

src\Simple_FFT.o:Simple_FFT.c:(.text.startup+0x3b): undefined reference to `kiss_fftr_alloc'
src\Simple_FFT.o:Simple_FFT.c:(.text.startup+0x86): undefined reference to `kiss_fftr'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: src\Simple_FFT.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation

问题是,Eclipse 没有将 KissFFT 的 c 文件链接到包含的头文件。 所以我找到了两种解决方案来绕过这个问题:

首先:手动编译程序:

gcc -o E:\Programming\Programs\Simple_FFT\Release\Simple_FFT -I"E:\Programming\Libraries\kiss_fft130" -I"E:\Programming\Libraries\kiss_fft130\tools" E:\Programming\Programs\Simple_FFT\src\Simple_FFT.c E:\Programming\Libraries\kiss_fft130\tools\kiss_fftr.c E:\Programming\Libraries\kiss_fft130\kiss_fft.c

如您所见,我手动包含了 *.c 文件“kiss_fftr 和 Kiss_fft”,编译很好。

第二个解决方案:在 Eclipse 中,我转到 Project -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MinGW C Linker -> Miscellaneous -> Other Objects -> 并添加了 E:\Programming\库\kiss_fft130\kiss_fftr.c 和 E:\Programming\Libraries\kiss_fft130\kiss_fft.c。

那么程序也可以正常编译了。

两者都不是我的意图。因为我必须手动链接我在程序中使用的每个 *.c 文件。我在 Eclipse 属性中的失败是什么,它不会自动将正确的文件链接在一起?

很高兴得到答案,以便我可以开始正确编程:)

【问题讨论】:

    标签: c eclipse linker mingw eclipse-cdt


    【解决方案1】:

    您需要将您的C 文件夹添加到Project Properties-&gt;C/C++ General-&gt;Paths and Symbols 中的Source Locations。或者,如果您编译了 kiss 库(.lib 或 .a),则应将其添加到链接器部分 Library Search pathLibraries

    【讨论】:

    • 如果我这样做,它希望将 libaries 文件夹中的所有 *.c 文件链接到我的 c 文件。不仅是我在每个头文件中包含的两个需要的。所以这会带来其他问题(因为文件并非旨在将所有文件链接在一起。为什么链接器不在与 h 文件(包含目录中)相同的目录中查找 c 文件?如何我告诉 Eclipse 它只需要链接与我包含的头文件同名的 c 文件?提前谢谢!
    • 有人可以帮忙吗?或者如果 c 文件没有设计为库,这是一个常见问题吗?请帮助我,我是初学者!
    • 在 Eclipse 中,您可以通过右键单击它们并选择“从构建中排除”来从构建中排除特定的源文件。这是一种方式。另一种方法是使用所谓的“工作集”,允许您创建多个配置,其中包含哪些文件将成为构建的一部分。谷歌关于“日食工作集”。
    • 啊,非常感谢。它是 Eclipse 特有的问题吗,链接器/编译器不会在与头文件相同的方向上查找 *.c 文件,或者这种行为是否正常,我必须分别告诉每个 IDE 在哪里查找头文件以及 *.c 文件在哪里?
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2018-09-24
    • 1970-01-01
    • 2011-09-03
    • 2017-04-07
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多