LINUX.ORG.RU

multiple definition

 , , ,


0

2

Добрый день!

Пытаюсь собрать следующую программу с Github'а https://github.com/222464/NeoRL. Делаю cmake, make. Когда делаю make, получаю кучу warning'ов, но ошибок нет. А вот линковка не проходит. Получаю 24 очень похожих ошибки:

CMakeFiles/NeoRL.dir/source/neo/PredictiveHierarchy.cpp.o: In function `cl::operator|(cl::QueueProperties, cl::QueueProperties)': PredictiveHierarchy.cpp.text+0xf8): multiple definition of `cl::operator|(cl::QueueProperties, cl::QueueProperties)' CMakeFiles/NeoRL.dir/source/neo/Swarm.cpp.o:Swarm.cpp.text+0xf8): first defined here

Во всех написано про multiple definition of `cl::operator| только с разными типами параметров. И в каждой из них написано про файл Swarm.cpp.

Про то, что такое множественное определение представление имею, но вот что смотреть и как исправить не понимаю. Что-нибудь похожее на cl::operator| в исходниках не нашла...

Помогите, пожалуйста.

Посмотри в своём cl2.hpp из OpenCL SDK - как там объявлен «operator|» для QueueProperties. Если

QueueProperties operator|(QueueProperties lhs, QueueProperties rhs)
- то замени его на обновлённый с khronos.org, там теперь
inline QueueProperties operator|(QueueProperties lhs, QueueProperties rhs)

Проблема возникала, когда этот hpp инклудится в нескольких файлах сразу. Вот тут у людей такая же история http://stackoverflow.com/questions/33214838/linker-error-using-opencl-2-0-c-b...

Каждый раз как натыкаюсь на этот плюсовый интерфейс - с ним проблемы. То стандартные exstensions не поддерживаются, то от версии к версии совместимость ломается. Лучше уж свою обёртку над сишным интерфейсом OpenCL писать - «стандартная» только для helloworld'ов годится.

tim239 ★★
()
Ответ на: комментарий от tim239

Все верно! inline отсутствуют. Спасибо Вам большое!!! Уже три дня искала причины...

Я ставила opencl с сайта AMD. Там нужно только распаковать файл AMD-APP-SDK-v3.0.130.135-GA-linux32.sh и запустить его.

Как я могу собрать opencl из исходников, чтобы была возможность изменить cl2.hpp и какие пути нужно будет прописывать в переменные окружения?

Ana1251
() автор топика
Ответ на: комментарий от Ana1251

Можно просто найти этот файл в системе (вроде find /usr/include -name cl2.hpp) и подправить на месте.

xaizek ★★★★★
()
Ответ на: комментарий от tim239

Добрый день!

Обновила OpenCL. Теперь он с inline. Но возникает следующая ошибка. Что это такое? И как можно исправить?

Linking CXX executable NeoRL /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): перемещение 0 имеет недопустимый индекс символа 11

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): перемещение 1 имеет недопустимый индекс символа 12

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): перемещение 2 имеет недопустимый индекс символа 2

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): перемещение 3 имеет недопустимый индекс символа 2

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): перемещение 4 имеет недопустимый индекс символа 11

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): перемещение 5 имеет недопустимый индекс символа 13

/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' CMakeFiles/NeoRL.dir/source/system/ComputeSystem.cpp.o: In function `cl::CommandQueue::CommandQueue(cl::Context const&, cl::Device const&, unsigned long long, int*)': ComputeSystem.cpp:(.text._ZN2cl12CommandQueueC2ERKNS_7ContextERKNS_6DeviceEyPi[_ZN2cl12CommandQueueC5ERKNS_7ContextERKNS_6DeviceEyPi]+0x8b): undefined reference to `clCreateCommandQueueWithProperties' collect2: error: ld returned 1 exit status make[2]: *** [NeoRL] Ошибка 1 make[1]: *** [CMakeFiles/NeoRL.dir/all] Ошибка 2 make: *** [all] Ошибка 2

Ana1251
() автор топика
Ответ на: комментарий от Ana1251

Похоже что не найдена функция main() во время линковки исполняемого файла. Какую команду он пытается выполнить при этом? (Видно с make VERBOSE=1)

tim239 ★★
()
Ответ на: комментарий от tim239

Да, с make VERBOSE=1, показывает следующее, с чем это может быть связано?

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): перемещение 21 имеет недопустимый индекс символа 22

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): перемещение 0 имеет недопустимый индекс символа 2

/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function `_start':

(.text+0x18): undefined reference to `main'

CMakeFiles/NeoRL.dir/source/system/ComputeSystem.cpp.o: In function `cl::CommandQueue::CommandQueue(cl::Context const&, cl::Device const&, unsigned long long, int*)': ComputeSystem.cpp:(.text._ZN2cl12CommandQueueC2ERKNS_7ContextERKNS_6DeviceEyPi[_ZN2cl12CommandQueueC5ERKNS_7ContextERKNS_6DeviceEyPi]+0x97): undefined reference to `clCreateCommandQueueWithProperties' collect2: error: ld returned 1 exit status make[2]: *** [NeoRL] Ошибка 1 make[1]: *** [CMakeFiles/NeoRL.dir/all] Ошибка 2 make: *** [all] Ошибка 2

Ana1251
() автор топика
Ответ на: комментарий от Ana1251

А какую конкретно команду запускал make? Это что-то вроде /usr/bin/c++ (куча опций) (объектники) -o исполняемый файл.

Это связано, как я уже писал, с отсутствием функции main() при линковке исполняемого файла.

tim239 ★★
()
Ответ на: комментарий от Ana1251

Вместо того, чтоб удалять постоянно комментарии по причине «Для редактирования», лучше один раз прочти LORCODE. И тебе, и нам будет проще. Конкретно твои выводы программ лучше оборачивать в [code][/code]

Deleted
()
Ответ на: комментарий от tim239

Спасибо большое! Разобралась. Все заработало))))

Ana1251
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.