Ошибка связывания C ++: компилятор не может найти определение функции - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть файл Cache.cpp, который имеет соответствующий заголовочный файл Cache.h, и другой файл NetFunctions.cpp, который имеет соответствующий заголовочный файл NetFunction.h.

У меня есть make-файл, который выглядит следующим образом

all: net cache
    g++ main.cpp ../obj/NetFunctions.o ../obj/Cache.o -o ../bin/main
net: NetFunctions.cpp
    g++ -c NetFunctions.cpp -o ../obj/NetFunctions.o
cache: Cache.cpp net
    g++ -c Cache.cpp ../obj/NetFunctions.o -o ../obj/Cache.o

Теперь в NetFunctions.cpp определена функция getNFHTML (string), которая используется в Cache.cpp.Я проверил заголовочные файлы, и они отлично смотрятся со всеми функциями, объявленными там, и правильно включены заголовочные файлы.

Однако, когда я делаю, я получаю следующую ошибку компоновщика

../obj/Cache.o: In function `Cache::getHTML(std::basic_string<char,  std::char_traits<char>, std::allocator<char> >)':
Cache.cpp:(.text+0x19ee): undefined reference to `getNFHTML(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [test] Error 1***

Может кто-то помочь мне с этим?В чем проблема?

Я также ссылался на этот пост C ++ Ошибка связи , но она мне не помогла.

Редактировать

Вот код: NetFunctions.h

#ifndef NET
#define NET 1

#include "commons.h"

bool serv_bind(struct addrinfo **servinfo, struct addrinfo **p, int *sockfd, int *yes);
void* get_in_addr(struct sockaddr *sa);
string getNFHTML(string website);  
string saveHeaders(string);
//bool getNFHTML(string request, string last_modified, string *response);
extern bool useCache;

#endif

NetFunctions.cpp

    #include "NetFunctions.h"
    string getNFHTML(string request)
    {
    // a lot of code
    }

Cache.cpp

#include "NetFunctions.h"
#include "Cache.h"
string Cache::getHTML(string request)
{
//some code
    string response = getNFHTML(request);
//some code
}

Я удалил файлы, так как они содержали несколькосто строк

Ответы [ 3 ]

1 голос
/ 05 декабря 2011

Это не имеет никакого отношения к проблеме, но я поставил ее в ответ, чтобы она была лучше отформатирована.

Ваш make-файл не очень хорошо обрабатывает зависимости. Попробуйте вместо этого:

.PHONY: all
all: ../bin/main

../bin/main: main.cpp ../obj/NetFunctions.o ../obj/Cache.o
    g++ $^ -o $@

../obj/NetFunctions.o: NetFunctions.cpp
    g++ -c $< -o $@

../obj/Cache.o: Cache.cpp 
    g++ -c $< -o $@

Для цели ../bin/main переменная $^ означает выполнение всех предварительных условий, а $@ является целью правила. Это означает, что вы можете добавить столько объектных файлов, сколько захотите, и все они будут связаны.

Для компиляции исходного кода в объектные файлы переменная $< является первой предпосылкой. Это также облегчит копирование / вставку целей, если вы добавите больше файлов.

Правила также гарантируют, что при сборке ../bin/main все файлы, от которых он зависит, будут собраны правильно.

Первая цель, all, будет использоваться по умолчанию, если вы запустите make без указания цели. Он был помечен как phony target, потому что он не создает файл с именем all.

Обратите внимание, что я основываю это на GNU make, которая является стандартной для почти всех дистрибутивов Linux, и в Cygwin / MingW. Если вы используете BSD, переменные могут измениться.

0 голосов
/ 05 декабря 2011

В то время как ваш Makefile довольно сломан, совершенно очевидно, что , если , что вы говорите:

В NetFunctions.cpp определена функция getNFHTML (string)

было правдой, тогда это сработало бы. Поэтому должно быть, что вы лжете нам. Покажите код для getNFHTML в NetFunctions.cpp или хотя бы вывод из:

nm ../obj/NetFunctions.o | grep getNFHTML

Обновление:

Хорошо, то, что вы сказали нам , является правдой. Однако, похоже, что цель, которая не может соединиться, называется test, и в вашем make-файле такой цели нет.

Я предполагаю, что , что цель связана без обязательного NetFunctions.o на линии связи.

В любом случае, пожалуйста, обновите ваш вопрос с помощью фактической линии связи, которая не работает.

0 голосов
/ 05 декабря 2011

Изменение:

cache: Cache.cpp net
    g++ -c Cache.cpp ../obj/NetFunctions.o -o ../obj/Cache.o

на:

cache: Cache.cpp net
    g++ -c Cache.cpp -o ../obj/Cache.o

Еще лучше, избавьтесь от фиктивных целей и включите предупреждения компилятора:

../bin/main: ../obj/NetFunctions.o ../obj/Cache.o
    g++ -Wall main.cpp ../obj/NetFunctions.o ../obj/Cache.o -o $@
../obj/NetFunctions.o: NetFunctions.cpp
    g++ -Wall -c NetFunctions.cpp -o $@
../obj/Cache.o: Cache.cpp
    g++ -Wall -c Cache.cpp -o $@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...