编译器标志-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

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

库应该排在最后(至少在源文件和对象文件之后)。你真的无法改变这一点。

-l最好粘贴到库名称上

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

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

正如James Kanze所评论的,如果专门使用gdb,您可能希望用-ggdb替换-g

使用g++(通常在Unix下),-l指定输入(.a.so),并且在顺序当输入是静态库(.a文件)时将扫描解析未定义引用的对象;如果它是.so,则其中没有任何对象文件,但它只有在解决一些问题时才会考虑未定义的符号。

当您将-l放在任何对象文件之前时尚未定义的符号,因此不会将任何内容合并到程序

相关内容

  • 没有找到相关文章

最新更新