Ссылка .o (объектный файл C) на C ++ файл / проект в Linux - PullRequest
2 голосов
/ 13 сентября 2011

У меня проблема с файлом .o в linux:

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

#define ECL_Drawrect ECL_bDrawrect

Вмой Visual.cpp Я также включаю "ecl.h" как:

#include "ecl.h"

int main() {
    ECL_Drawrect (0,0,20,20,false);
    return 0;
}

Проблема в том, что функция ECL_bDrawrect находится в файле ecl.o , и я не знаю, какчтобы связать его, чтобы использовать функцию, упомянутую выше.

После некоторого исследования я выяснил и настроил следующим образом:

g++ Visual.cpp -o Visual /usr/include/ecl.o

Путь ecl.o также включался в мой проект и когда я компилироваля получаю эту ошибку:

**** Build of configuration Debug for project Visual ****

make all 
Building file: ../src/Visual.cpp
Invoking: GCC C++ Compiler
g++ -m32 -O0 -g3 -Wall -c -fmessage-length=0 /usr/include/ecl.o -MMD -MP -MF"src/Visual.d" -MT"src/Visual.d" -o "src/Visual.o" "../src/Visual.cpp"
g++: /usr/include/ecl.o: linker input file unused because linking not done
Finished building: ../src/Visual.cpp

Building target: Visual
Invoking: GCC C++ Linker
g++ -m32  -o "Visual"  ./src/Visual.o   
/usr/bin/ld: ./src/Visual.o: in function main:../src/Visual.cpp:7: error: undefined reference to 'ECL_bDrawrect'
collect2: ld returned 1 exit status
make: *** [Visual] Error 1

**** Build Finished ****

Я не знаю, является ли ссылка правильной или нет?Как правильно связать этот файл ecl.o?

p / S: я использую eclipse CDT в 64-битной Ubuntu 11.04, а ecl.o для 32-немного, поэтому я должен поставить -m32 в g ++.

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

Файл ecl.o отсутствует в командной строке компоновщика.

Кроме того, вам, вероятно, нужно использовать extern "C" для включения:

extern "C" {
#include "ecl.h"
}
0 голосов
/ 13 сентября 2011

Возможно ли, что проблема в искажении имен в C ++? Возможно, объявив ваши функции как внешние "C", это сработает.

#ifdef __cplusplus 
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif
...