2014-01-06 4 views
0

мой main.cpp:г ++ связываннии статической библиотеки

#include <iostream> 

int foo(int arg); 

using namespace std; 

int main() 
{ 
    int x = foo(22); 
    cout << x; 
    return 0; 
} 

командной строки компиляции (Ubuntu 13.10):

g++-4.8 -L. -lfoo main.cpp -o main_app 

libfoo.a содержит int foo(int) , но я всегда получаю ту же ошибку компилятора:

/tmp/cciAyTSP.o: In function `main': 
main.cpp:(.text+0x19): undefined reference to `foo(int)' 
collect2: error: ld returned 1 exit status 
+0

'foo' не ** определяется ** внутри вашего кода, или, в лучшем случае, он не определен или' extern' внутри вашей единицы перевода. – user2485710

+1

Как вы создаете libfoo.a? Не могли бы вы дать нам [минимальный полный пример] (http://sscce.org)? – Beta

+0

@ user2485710 Функции не нужно объявлять 'extern' –

ответ

3

Конечно, это невозможно е, чтобы убедиться, не воспроизводимым случае, но общая ошибка в том, что если функция foo написана на C, то вам нужно поставить

extern "C" { int foo(int); } 

в .h файл для C++ программы, чтобы позволить ему знать, что функция не был написан на C++.

Чтобы записать файл заголовка межъязыкового, который будет хорошо как для C и C++ общего подход

#ifdef __cplusplus 
extern "C" { 
#endif 

... C declarations ... 

#ifdef __cplusplus 
} 
#endif 
+2

также, переместите -lfoo в конец команды. – Xephon

+0

@Xephon no, это не помогает – iamnp

+1

@iamnp Не перемещение оператора связи может вызвать другие проблемы. Не пытайтесь ответить на этот вопрос, но лучше всего представляете себе лучшую практику. – Xephon

0

В дополнении к 6502 в ответ и предложение Xephon, также следует помнить, что порядок параметров дело. Вместо того, чтобы:

g++-4.8 -L. -lfoo main.cpp -o main_app 

Вы должны написать:

g++-4.8 main.cpp -o main_app -L. -lfoo 

Это потому, что ld является однопроходной линкер. Он не будет пересматривать библиотеку libfoo, чтобы использовать символ из нее для main_app.o.

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