2013-07-05 1 views
0

У меня странная проблема. У меня есть эти файлы:undefined ссылка на функцию, при использовании, если она определена в Windows (на Linux это нормально)

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 

main.cpp:

#include "lib.h" 

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

Когда я бег такой код на Windows, у меня есть ошибка: undefined reference to fun. В Linux (Ubuntu) это нормально, компиляция без ошибок. Когда я помещаю все в один файл (в Windows), это нормально. Но мне нужно иметь его в файлах separete. Как все исправить? В Windows Im используется MinGW с кодом :: Blocks.

+0

Определяется ли «_X86_»? – doctorlove

+1

'# if' в lib.c кажется излишним сложным. Позаботьтесь, чтобы объяснить, что вы пытались сделать там? – ComicSansMS

+0

как вам удается форматировать этот код? Мне не удалось ... есть ли что-то особенное? –

ответ

3

Code :: Blocks, вероятно, скомпилирует ваш .c файл как код C, тогда как в Linux вы компилируете все как код на C++, например. путем непосредственного вызова g ++.

Вы должны сказать, что функция имеет fun С связь, поэтому lib.h должен иметь это:

#ifdef __cplusplus 
extern "C" { 
#endif 

double fun(int a); 

#ifdef __cplusplus 
} 
#endif 

Вы, естественно, будет также необходимо перепроверить, что по крайней мере один из условий вашей библиотеки, .c файл являются оценивается как истина

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

(так, по крайней мере попытаться путем удаления, что весь #if)

+0

Большое вам спасибо, вот и все! Просто добавил 'extern ...' в мой файл '* .h', и он сработал :) Не могли бы вы сказать мне, что именно это означает? Или где я могу прочитать об этом больше? – yak

+1

@yak см. Http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c – nos

+0

еще раз спасибо :) – yak

1
  1. Я не уверен, что вы можете использовать логические операторы с препроцессором, это может зависеть от вашей инструментальной цепочки;
  2. #define MY_FUN и !defined(MY_FUN) не нужны, поскольку вы не будете скомпилировать файл дважды;
  3. Существует, вероятно, по крайней мере, еще один файл в вашем проекте, который играет роль с этой проблемой, так как, как я ожидал, этот код

    #if (определение (_WIN32) || определена (_WIN64)) & & (определено (__ MINGW32__) || определено (__ MINGW64__)) & & определено (_X86_) случайная ошибка !!! #endif

    int main() { возвращение 0; }

компилирует плавно

g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 as well as on gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

(извините о форматировании, мне не удалось сделать это хорошо выглядеть).

+0

Я знаю, что он компилируется на Ubuntu ... но в Windows это не ... Когда я помещаю все в один файл '* .cpp' на Windows, он просто компилируется с помощью Code :: Blocks. Любые решения? В моем проекте есть какие-то другие файлы, только те, что я вставлял здесь;) – yak

+0

nope, моя точка зрения: на ubuntu ваше предложение #if приводит к тому, что его содержимое не будет видно компилятору (в моем примере строка «random error !!! "не получает жалобы от компилятора. В Ubuntu тогда, если вы просто попытаетесь скомпилировать то, что вы разместили на вопросе, оно не будет компилироваться (из-за отсутствия определения удовольствия. –

+0

Ok Я вижу, спасибо :), поэтому мне нужно добавить некоторые 'if defined' для ubuntu тоже! Cheers – yak

 Смежные вопросы

  • Нет связанных вопросов^_^