编译器标志的位置-l

时间:2014-04-16 11:13:06

标签: c++ netbeans compiler-construction opencl compiler-flags

我目前正在学习OpenCL。现在,当我想编译我的程序时,我得到一个错误:

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

错误主要是未定义的引用,因为我没有链接库(不过我会在最后发布错误代码)。

但是使用这个命令一切正常:

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

所以我的问题是,我需要做什么,在命令前使用-l Flag? (背景是:我想使用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

2 个答案:

答案 0 :(得分:2)

g++的[大多数]参数的顺序非常重要。

库应该是最后的(至少在源文件和目标文件之后)。你无法真正改变它。

-l最好粘贴到库名称:

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

您可能还希望将-g(除了-Wall)传递给编译器以获取可调试的二进制文件。使用gdb调试器。

James Kanze评论时,如果专门使用-g,您可能希望将-ggdb替换为gdb

答案 1 :(得分:1)

使用g ++(通常在Unix下),-l指定的来源 输入(.a.so),输入处理 订购。当输入是静态库(.a文件)时,它 将扫描解析未定义引用的对象; 如果它是.so,则其中没有任何目标文件,但它 如果它解决了一些问题,它仍然会被考虑在内 未定义的符号。

当你在任何目标文件之前放置-l时,没有 尚未定义的符号,因此没有任何内容可以纳入 程序。