2015-01-12 1 views
2

Я пытаюсь связать скомпилированный research experiment project, встроенный в C/C++. Проект зависит от HyperNEAT и программного обеспечения для моделирования роботов WeBots. Я успешно клонировал и построил проект HyperNEAT (в этом проекте есть другие зависимости, такие как Boost, TinyXML, JGTL (пользовательская библиотека) и другие несвязанные подпроекты).C++ make link step: Неопределенные символы для архитектуры x86_64

Я сделал Makefile, включая все neccesary пути поиска заголовков и библиотеки путей, и составление двух основных .cpp файлов:

/ModHyperNEAT/mod_ctrler7.cpp 
/ModSupervisor/mod_supervisor.cpp 

работы, что дает мне 2 .o файлы.

Однако в макияжем ссылку шаг, когда я хочу создать (отдельные) исполняемые файлы обоих файлов, я получаю «неопределенные символы для архитектуры x86_64» ошибка (см Pastebin здесь: http://pastebin.com/kiwwCcUf). Похоже, что стандартные типы данных C++ и такие функции, как std::string::end() const, не могут быть найдены.

Я искал ответы на эти вопросы и искал SO, и кажется, что либо библиотеки отсутствуют, либо двоичные несовместимы, если я правильно понимаю, но библиотеки есть, и оба проекта были скомпилированы с флагом -lstdc++.

Это шаг делает ссылку (и используются макросы из Makefile):

CC = gcc 
CFLAGS = -v -g -lstdc++ -Wall -Wno-error -ferror-limit=100 -fmessage-length=0 
DEFINES = -DHCUBE_NOGUI -DTIXML_USE_STL 
FLAGS = $(CFLAGS) $(DEFINES) 

LIB_TINYXML = -L/Users/michahell/Documents/projects_c++/HyperNEAT/tinyxmldll/out 
LIB_HYPERNEAT = -L/Users/michahell/Documents/projects_c++/HyperNEAT/NE/HyperNEAT/out 
LIB_BOOST = -L/usr/local/Cellar/boost/1.57.0/lib 
LIB_WEBOTS = -I/Applications/Webots/lib 

LIBS = $(LIB_TINYXML) $(LIB_HYPERNEAT) $(LIB_BOOST) $(LIB_WEBOTS) 
LIBFLAGS = -ltinyxmlpluslib -lboost_filesystem-mt -lboost_random-mt -lboost_system-mt -lNEATLib_d -lHypercube_NEAT_Base_d 
WEBOTS_DYLIB = -dylib_file /Applications/Webots/lib/libController.dylib:/Applications/Webots/lib/libController.dylib 

$(CC) $(FLAGS) $(LIBS) ./mod_ctrler7.o $(WEBOTS_DYLIB) $(LIBFLAGS) 

я узнал, что в связи с .dylib-х я должен был использовать определенный флаг и указать полный путь , следовательно $ (WEBOTS_DYLIB) макрос. Я использую флаг -lstdc++, потому что в проекте HyperNEAT этот флаг также использовался для создания этой библиотеки. Если я исключил этот флаг, я получаю много ошибок во время компиляции (libC++ и libstdC++ несовместимость, как я теперь понимаю). Все пути библиотеки проверяются и .a и/или .dylib файлы присутствуют.

Мои знания о инструментах C/C++ и GCC очень ограничены, так как я никогда не использовал их раньше. Я думаю, что это может быть связано с тем, что проект HyperNEAT содержит дистрибутив Boost 1.57.0, который используется для их сборки, и что у меня есть отдельная (с использованием доморощенного) Boost версия, установленная в моей системе, что является тем же версия:

$ brew info boost 
boost: stable 1.57.0 (bottled), HEAD 
http://www.boost.org 
/usr/local/Cellar/boost/1.57.0 (10572 files, 439M) * 

Что может быть причиной этой ошибки, не удавшейся по моей ссылке? Любой должен иметь возможность воспроизвести мои ошибки компоновщика, если оба HyperNEAT и мой проект клонированы и помещают свои корневые директории в том же месте. WeBots следует загружать, но только для заголовков и библиотек. И, конечно, мои пути makefile должны быть изменены.

Если кто-нибудь может дать мне советы о том, как решить эту проблему, я бы ВЕЛИКОЕ оценил это!

+0

Вместо того, чтобы вручную связываться с 'stdC++', почему бы просто не построить свой код на C++ с помощью 'g ++', который обрабатывает это автоматически? –

+0

У меня нет хорошего ответа на это, так как я не знаком с сложностями сборки C/C++, я постараюсь сделать это сейчас и посмотреть, что-нибудь изменится. –

+0

Я заменил GCC для G ++ и удалил флаг lstdC++. По крайней мере, для этапа ссылки ничего не меняется, и ошибки сохраняются, к сожалению:/ –

ответ

0

Оказалось, что по какой-то причине я должен был включить флаг lstdc++ в флаги ссылки библиотеки, а не как флаг компилятора, а stdlib=libstdc++ - как флаг компилятора.

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