2015-03-25 4 views
0

Хорошо, я разрабатываю небольшую сетевую библиотеку для использования в другом приложении. У меня есть функция, объявленная в NetStream.h как так:C++ - Неопределенная ссылка на существующую функцию

class NetStream; 
class NetStream { 
public: 
    static NetStream *connect(char *ip, char *port, char** error); 
    ... 
} 

В моей NetStream.cpp, я получил это определиться с тем же прототипом:

NetStream* NetStream::connect(char *ip, char *port, char** error) { 
    ... 
} 

Когда я objdump мой libNetLib .о, я могу видеть, что NetStream :: Коннект определяется:

$ objdump -Ct NetLib/libNetLib.a | grep 'connect' #demangled names 
000000000000031a g  F .text 00000000000001b4 NetStream::connect(char*, char*, char**) 
0000000000000000   *UND* 0000000000000000 connect 

$ objdump -t NetLib/libNetLib.a | grep 'connect' #mangled names 
000000000000031a g  F .text 00000000000001b4 _ZN9NetStream7connectEPcS0_PS0 
0000000000000000   *UND* 0000000000000000 connect 

в файле объект в приложении, которое использует мой Netlib, objdump показывает, что это импортирование функции с тем же прототипом:

$ objdump -Ct connection.cpp.o | grep 'connect' 
... 
0000000000000000   *UND* 0000000000000000 NetStream::connect(char*, char*, char**) 
... 

$ objdump -t connection.cpp.o | grep 'connect' 
... 
0000000000000000   *UND* 0000000000000000 _ZN9NetStream7connectEPcS0_PS0_ 
... 

Но когда я связать приложение с г ++ 4.9.2, я получаю эту ошибку:

connection.cpp:(.text+0x52): undefined reference to `NetStream::connect(char*, char*, char**)' 

Это происходит, когда CMake пытается связать его, и когда я связать его с помощью следующей команды:

Я получаю ту же неопределенную ссылку (и кучу других неопределенных ссылок, потому что есть и другие вещи, которые нужно связать, так что я не связывался там).

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

Что такое real проблема здесь?

ответ

2

Вам действительно нужно найти значение параметров командной строки для g ++, потому что вы плохо злоупотребляете ими.

-L сообщает компоновщику, чтобы посмотреть в для файлов библиотеки. Если у вас нет директории с именем «NetStream.cpp.o» (что маловероятно), и вы указываете библиотеки в этом каталоге для связи (чего у вас нет), ваша командная строка является тарабарщиной.

Ваша командная строка эффективно сообщает компоновщику, чтобы он смотрел в каталог для файлов библиотеки, но не предоставлял никакой информации о том, какие библиотеки должны быть связаны. Таким образом, ваш «NetLib.a» даже не получает доступ к компоновщику.

Предполагая, что у вас есть библиотека с именем NetLib.a в каталоге (относительно рабочего каталога при вызове g ++) с именем NetLib, тогда, как указал занятый русский, вам либо нужно выполнить «g ++ connection.cpp.o -LNetLib -lNetLib -o/tmp/tst "для связи с библиотекой или" g ++ connection.cpp.o NetLib/libNetLib.a -o/tmp/tst ".

3

g++ connection.cpp.o -L NetStream.cpp.o -o /tmp/tst

Эта командная строка полностью фиктивная. Попробуйте вместо этого:

g++ connection.cpp.o -LNetLib -lNetLib -o /tmp/tst 

или это:

g++ connection.cpp.o NetLib/libNetLib.a -o /tmp/tst 

Update:

What is the real problem here?

реальная проблема заключается в том, что ваша команда ссылка линия неверна (как указано выше) ,

I can't really compile my code like that ...

Компиляция не проблема здесь, ссылка есть.

Предположительно вы не можете создать правильную ссылку, потому что используете CMake, и это CMake, которая строит командную строку фиктивной ссылки.

Поскольку мы знаем что CMake работы, мы должны предположить, что это ваш CMakefile, что является основной причиной. К сожалению, вы не указали свой CMakefile.

Вы должны задать отдельный вопрос, например: «У меня есть следующее CMakefile, в результате чего получается следующая линия ссылок, которая говорит мне, что это подделка. Что случилось с моим CMakefile

+1

Почему это имеет значение? Да, это * работает *, но я не могу действительно компилировать свой код, как это, и он не отвечает на вопрос: «Что такое * реальная проблема здесь» – Xenotoad

+0

@Xenotoad Я обновил ответ. –

+0

Эта линия ссылок была только тем, что я использовал, чтобы проверить, был ли CMake проблематичным. Я построил его, так что, наверное, поэтому это действительно не сработало. Как сказал Питер, мне действительно нужно искать использование командной строки g ++. Конечно, если мой тест возвращает ложный отрицательный результат, это заставляет меня ошибочно полагать, что CMake работает нормально. Но, поскольку он работает, когда я настраиваю свою командную строку, это означает, что проблема с CMake была проблемой. Оказывается, что CMake просто не связывал NetLib по какой-то причине. Теперь исправлено – Xenotoad

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