编译器标志-l的位置

问题描述 投票:0回答:2

我目前正在学习 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
c++ netbeans opencl compiler-flags
2个回答
3
投票

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
投票

对于 g++(通常在 Unix 下),

-l
指定一个源 输入(a
.a
.so
),并且输入在 命令。 当输入是静态库(
.a
文件)时,它 将扫描解析未定义引用的对象; 如果它是
.so
,则其中没有任何目标文件,但它 只有在解决了一些问题后才会被考虑 未定义的符号。

当您将

-l
放在任何目标文件之前时,就没有 尚未定义的符号,因此不会将任何内容合并到 程序。

© www.soinside.com 2019 - 2024. All rights reserved.