Хорошо, я разрабатываю небольшую сетевую библиотеку для использования в другом приложении. У меня есть функция, объявленная в 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 проблема здесь?
Почему это имеет значение? Да, это * работает *, но я не могу действительно компилировать свой код, как это, и он не отвечает на вопрос: «Что такое * реальная проблема здесь» – Xenotoad
@Xenotoad Я обновил ответ. –
Эта линия ссылок была только тем, что я использовал, чтобы проверить, был ли CMake проблематичным. Я построил его, так что, наверное, поэтому это действительно не сработало. Как сказал Питер, мне действительно нужно искать использование командной строки g ++. Конечно, если мой тест возвращает ложный отрицательный результат, это заставляет меня ошибочно полагать, что CMake работает нормально. Но, поскольку он работает, когда я настраиваю свою командную строку, это означает, что проблема с CMake была проблемой. Оказывается, что CMake просто не связывал NetLib по какой-то причине. Теперь исправлено – Xenotoad