Положение флага компилятора -l

В настоящее время я изучаю OpenCL. Теперь, когда я хочу скомпилировать свою программу, я получаю сообщение об ошибке с этой командой:

g++ -Wall -l OpenCL main.cpp -o main

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

Но с этой командой все работает нормально:

g++ -Wall main.cpp -o main -l OpenCL

Поэтому мой вопрос: что мне нужно сделать, чтобы использовать флаг -l перед командой?
(Справочная информация: я хочу использовать Netbeans для компиляции моей программы, и когда я добавляю флаг в -> свойства -> сборка -> Компилятор C ++ -> дополнительные параметры, он вставляется в позицию, показанную в первой команде)

Заранее спасибо за помощь

Вот код ошибки:

/tmp/ccmKP4oI.o: In function `cl::detail::ReferenceHandler<_cl_context*>::release(_cl_context*)':
main.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP11_cl_contextE7releaseES3_[_ZN2cl6detail16ReferenceHandlerIP11_cl_contextE7releaseES3_]+0x14): undefined reference to `clReleaseContext'
/tmp/ccmKP4oI.o: In function `cl::detail::ReferenceHandler<_cl_command_queue*>::release(_cl_command_queue*)':
main.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP17_cl_command_queueE7releaseES3_[_ZN2cl6detail16ReferenceHandlerIP17_cl_command_queueE7releaseES3_]+0x14): undefined reference to `clReleaseCommandQueue'
/tmp/ccmKP4oI.o: In function `cl::Platform::getInfo(unsigned int, std::string*) const':
main.cpp:(.text._ZNK2cl8Platform7getInfoEjPSs[_ZNK2cl8Platform7getInfoEjPSs]+0x22): undefined reference to `clGetPlatformInfo'
/tmp/ccmKP4oI.o: In function `cl::Platform::get(std::vector<cl::Platform, std::allocator<cl::Platform> >*)':
main.cpp:(.text._ZN2cl8Platform3getEPSt6vectorIS0_SaIS0_EE[_ZN2cl8Platform3getEPSt6vectorIS0_SaIS0_EE]+0x41): undefined reference to `clGetPlatformIDs'
main.cpp:(.text._ZN2cl8Platform3getEPSt6vectorIS0_SaIS0_EE[_ZN2cl8Platform3getEPSt6vectorIS0_SaIS0_EE]+0xb4): undefined reference to `clGetPlatformIDs'
collect2: error: ld returned 1 exit status

3

Решение

Порядок [большинства] аргументов g++ очень важно.

Библиотеки должны идти последними (по крайней мере, после исходных и объектных файлов). Вы не можете изменить это.

-l желательно должно быть клееный на имя библиотеки:

 g++ -Wall main.cpp -o main -lOpenCL
#                          ^^^ glue the -l to the library name

Вы, вероятно, хотите также передать -g (в дополнение к -Wall) компилятору, чтобы получить отлаживаемый двоичный файл. Использовать gdb отладчик.

Как Джеймс Канзе прокомментировал, вы можете заменить -g с -ggdb если использовать специально gdb,

2

Другие решения

С g ++ (и вообще под Unix), -l указывает источник
вход (либо .a или .so), и ввод обрабатывается в
порядок. Когда вход является статической библиотекой ( .a файл), это
будут проверены объекты, которые разрешают неопределенные ссылки;
если это .so, в нем нет никаких объектных файлов, но это
будет по-прежнему приниматься во внимание только в том случае, если
неопределенный символ.

Когда вы положите -l до каких-либо объектных файлов, нет
пока не определены символы, поэтому ничего не будет включено в
программа.

1

По вопросам рекламы [email protected]