2012-08-01 2 views
2

У меня есть библиотека C, написанная кем-то еще, которую я хочу вызвать из моей программы на C++. Заголовок C структурирована следующим образом: программаВызов библиотеки C из C++

#ifndef INC_MOVE_CLIENT_H 
#define INC_MOVE_CLIENT_H 

#ifdef __cplusplus 
    extern "C" { 
#endif 

... 

int serverConnect(const char *, const char *, MoveStateDeferred *); 

... 

#ifdef __cplusplus 
} 
#endif 

#endif // ... INC_MOVE_CLIENT_H 

Я звоню serverConnect в моей C++ следующим образом:

#include "helloworld.h" 
#include "moveclient.h" 

int main(int argc, const char* argv[]) { 
    const char* ip = "192.168.1.2"; 
    const char* port = "7899"; 
    MoveStateDeferred* m; 
    serverConnect(ip, port, m); 
} 

Это кажется правильным мне по these instructions, но когда я пытаюсь скомпилировать я получаю :

$ gcc helloworld.cpp -o helloworld.out 
/tmp/ccuS93Yu.o: In function `main': 
helloworld.cpp:(.text+0x3c): undefined reference to `serverConnect' 
collect2: ld returned 1 exit status 

moveclient.c имеет реализацию serverConnect и находится в том же каталоге, что и другие файлы. Я использую неправильную команду для компиляции? Есть ли что-то, что мне нужно сделать, чтобы скомпилировать moveclient.c? Или это что-то еще не связано с компиляцией?

+0

важная вещь обратите внимание, что если вы не используете 'g ++', а не 'gcc' для компиляции, вы, скорее всего, получите дальнейшие ошибки ссылок. –

+0

Обратите внимание, что вы передаете неинициализированный и, следовательно, неверный указатель в качестве третьего аргумента serverConnect, MoveStateDeferred *. Вам нужно либо инициализировать m, чтобы указать на допустимый MoveStateDeferred, либо, более вероятно, объявить m как MoveStateDeferred m, а затем использовать & m как третий аргумент serverConnect. –

ответ

4

Компиляция команда неправильно.

Обычно вы делаете что-то вроде этого:

gcc -c helloworld.cpp -o helloworld.o 
gcc -c moveclient.c -o moveclient.o 
gcc moveclient.o helloworld.o -o helloworld.out 

... это связывает все объекты вместе.

+0

Спасибо, это исправлено моей оригинальной проблемой. – kshen

3

Вы сделали все правильно, но вам также нужно сообщить компоновщику, где найти реализацию serverConnect. Если у вас есть moveclient.c файл, то:

gcc helloworld.cpp moveclient.c -o helloworld.out 
5

Это не проблема компиляции, ее проблема связи.

Предполагая, что moveclient.c единственный дополнительный файл вам нужно, то у вас есть несколько вариантов:

Вы можете добавить файл .c в строку компиляции:

g++ helloworld.cpp moveclient.c -o helloworld.out 

Или вы можете скомпилировать .c (и ваш .cpp файл) в объектные файлы и связать их

g++ -c helloworld.cpp 
gcc -c moveclient.c 
g++ helloworld.o moveclient.o -o helloworld.out 

Или вы можете связать moveclient материал в библиотеку и добавить эту библиотеку по ссылке. Детали для создания библиотеки будут зависеть от вашей системы и того, нужна ли вам общая или динамическая библиотека. Но как только у вас есть библиотека вашей сборки строка будет выглядеть следующим образом (предполагается, что библиотека называется libmoveclient.so или libmoveclient.a)

g++ helloworld.cpp -L. -lmoveclient 

или если вы используете отдельный сборник:

g++ -c helloworld.cpp 
g++ helloworld.o -L. -lmoveclient 
+0

Спасибо, это помогает прояснить ответ Кевина Гранта. – kshen

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