0

我有一个奇怪的问题。我有这些文件:

lib.h:

#ifndef _LIB_H_
#define _LIB_H_

double fun(int a);

#endif

lib.c:

#include "lib.h"
#include <stdio.h>

#if !defined(MY_FUN) && ((defined(__MINGW32__) || defined(__MINGW64__)) && defined(_X86_))
#define MY_FUN
double fun(int a)
{
    printf("%d\n", a);
}
#endif

主.cpp:

#include "lib.h"

int main(int argc, char **argv)
{
    fun(2);
    return 0;
}

当我在 Windows 上运行此类代码时,出现错误:undefined reference to fun. 在 Linux(Ubuntu)上没问题,编译没有错误。当我将所有内容都放在一个文件中(在 Windows 上)时,它也可以。但我需要将它放在单独的文件中。如何使它正确?在 Windows 上,我使用带有 Code::Blocks 的 MinGW。

4

2 回答 2

3

Code::Blocks 可能会将您的 .c 文件编译为 C 代码,而在 linux 上您将所有内容编译为 C++ 代码,例如通过直接调用 g++。

你需要告诉fun函数有 C 链接,所以 lib.h 应该有这个:

#ifdef __cplusplus
extern "C" {
#endif

double fun(int a);

#ifdef __cplusplus
}
#endif

您自然还需要仔细检查 lib.c 文件中的至少一个条件是否为真

  #if !defined(MY_FUN) && ((defined(_WIN32) || defined(_WIN64)) && (defined(__MINGW32__) || defined(__MINGW64__)) && defined(_X86_))

(所以至少尝试删除整个 #if )

于 2013-07-05T10:24:21.577 回答
1
  1. 我不确定您是否可以在预处理器中使用逻辑运算符,这可能取决于您的工具链;
  2. #define MY_FUNand是不必要的!defined(MY_FUN),因为您不会编译该文件两次;
  3. 您的项目中可能至少还有一个文件与此问题有关,因为正如我所料,这段代码

    #if (defined(_WIN32) || defined(_WIN64)) && (defined(__MINGW32__) || defined(__MINGW64__)) && defined(_X86_) 随机错误!!!#万一

    int main(){ 返回 0; }

顺利编译

g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 以及 gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

(对不起格式,我没让它看起来不错)。

于 2013-07-05T10:34:43.463 回答