GCC:在Windows上编译OpenCL主机

5

我想尝试在Windows下使用OpenCL。

摘要:当我尝试编译(使用命令gcc my.o -o my.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64" -l OpenCL)时,出现了"undefined reference to"错误


我的代码

#include <CL/cl.h>
#include <stdio.h>

int main(void) {   
    cl_platform_id platform;
    int err;

    err = clGetPlatformIDs(1, &platform, NULL);
    if(err < 0) {
        perror("There's No Platform!");
        exit(1);
    }

    /* Some more code... */

    system("PAUSE");
}

Makefile

all: addition

addition:
    gcc -c -I "C:\Program Files (x86)\AMD APP\include" my.c -o my.o
    gcc my.o -o my.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64" -l OpenCL

使用的程序

  • MinGW的gcc
  • Visual Studio的nmake
  • AMD的OpenCL™ APP SDK(我从中提取了OpenCL库和CL.h文件)

APP SDK文件夹的结构

%>tree /F "C:\Program Files (x86)\AMD APP\lib\x86_64"
Auflistung der Ordnerpfade
Volumeseriennummer : D2DC-D765
C:\PROGRAM FILES (X86)\AMD APP\LIB\X86_64
    libOpenCL.a
    OpenCL.lib
    OpenVideo64.lib

Es sind keine Unterordner vorhanden


%>tree /F "C:\Program Files (x86)\AMD APP\include"
Auflistung der Ordnerpfade
Volumeseriennummer : D2DC-D765
C:\PROGRAM FILES (X86)\AMD APP\INCLUDE
├───CAL
│       cal.h
│       calcl.h
│       cal_ext.h
│       cal_ext_counter.h
│       cal_ext_d3d10.h
│       cal_ext_d3d9.h
│
├───CL
│       cl.h
│       cl.hpp
│       cl_d3d10.h
│       cl_ext.h
│       cl_gl.h
│       cl_gl_ext.h
│       cl_platform.h
│       opencl.h
│
└───OpenVideo
        OpenVideo.h
        OVDecode.h
        OVDecodeTypes.h
        OVEncode.h
        OVEncodeTypes.h

错误信息

        gcc addition.o -o addition.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64" -l OpenCL
addition.o:addition.c:(.text+0x2d): undefined reference to `clGetPlatformIDs@12'
addition.o:addition.c:(.text+0x83): undefined reference to `clGetDeviceIDs@24'
addition.o:addition.c:(.text+0xc2): undefined reference to `clGetDeviceIDs@24'
collect2: ld returned 1 exit status
NMAKE : fatal error U1077: "C:\prog-x86\MinGW\bin\gcc.EXE": Rückgabe-Code "0x1"
Stop.

我的问题

我的问题很简单:

  • 为什么我的代码不能按照预期编译?
  • 我该怎么做才能解决这个问题?

谢谢。


UPDATE: The error message after dropping the spaces like described in @codaddict 's answer.

(Makefile)

all: addition

addition:
  gcc -c -I "C:\prog-x86\AMD-APP\include" addition.c -o addition.o
  gcc addition.o -o addition.exe -LC:\prog-x86\AMD-APP\lib\x86_64 -lOpenCL

(Shelldata)

%>nmake

Microsoft (R) Program Maintenance Utility, Version 11.00.50727.1
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.

        gcc -c -I "C:\Program Files (x86)\AMD APP\include" addition.c -o addition.o
addition.c: In function 'main':
addition.c:14:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by d
efault]
addition.c:23:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by d
efault]
        gcc addition.o -o addition.exe -LC:\prog-x86\AMD-APP\lib\x86_64 -lOpenCL
addition.o:addition.c:(.text+0x2d): undefined reference to `clGetPlatformIDs@12'
addition.o:addition.c:(.text+0x83): undefined reference to `clGetDeviceIDs@24'
addition.o:addition.c:(.text+0xc2): undefined reference to `clGetDeviceIDs@24'
collect2: ld returned 1 exit status
NMAKE : fatal error U1077: "C:\prog-x86\MinGW\bin\gcc.EXE": Rückgabe-Code "0x1"
Stop.

%>

@Thomas 谢谢你的想法,但那并没有改变任何事情。 - fridojet
如果您删除-L参数并改为提供OpenCL.lib的完整路径,会有所不同吗?因此,请删除-Lpath并添加未经限定的“C:\ Program Files(x86)\ ... \ x86_64 \ OpenCL.lib”,以告诉gcc“嘿,这是一个您可能会发现有用的文件”? - Thomas
@Thomas gcc 对上述命令的响应如下:c:/prog-x86/ [...] /mingw32/bin/ld.exe: 无法找到 -lOpenCL - collect2: ld 返回 1 个退出状态 - fridojet
1
好的,那就算了吧。它返回这个意味着它能够正确地找到你现在所使用的OpenCL库,只是链接失败了。尝试使用-static标志... - Thomas
感谢您的建议 - 但是 gcc addition.o -o addition.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64\" -l OpenCL -Wl,-static 也没有帮助。undefined reference 错误仍然存在。- 您知道我可能如何处理这个问题吗? - fridojet
显示剩余3条评论
3个回答

10

默认的MinGW发行版只提供用于构建x86应用程序的工具。您不能链接到OpenCL库的x64版本。因此,您必须使用 MinGW-w64 或使用x86版本(将库路径更改为APP SDK的x86子文件夹)。


1
尝试更改。
-l OpenCL

-lOpenCL

在编译行中。

gcc 的 -l 选项期望紧挨着它的是库的名称(不带 lib 前缀),没有空格。还记得在学校使用 -lm 链接到 libm 吗?


谢谢您的提议,但它并没有改变任何事情。 - fridojet
@fridojet:你能否在“-L”后面也去掉空格? - codaddict
我也试过了,但也没有帮助。谢谢你的想法 - 还有其他的吗? - fridojet
感谢您的关注。现在我也尝试了脚本,选项名称后没有空格,但使用旧路径。 - fridojet
顺便说一下:我最初尝试了一些空格,因为die says它也可以。所以理论上不应该有任何区别。 - fridojet
显示剩余3条评论

0

Windows 10 上的 64 位 g++ 编译器也在 bin 文件夹中:

"C:\MinGW\bin\x86_64-w64-mingw32-g++.exe"

所以这对我有效:

C:\MinGW\bin>x86_64-w64-mingw32-g++ "C:\Users\...\main.cpp" -o
C:\Users\...\saxpy  -L "C:\Program Files\...\x64" -lOpenCL -I
"C:\...\OpenCL\sdk\include"

注释:

  1. -o 输出名称
  2. -L 包含 OpenCL.lib 的文件夹
  3. -I 包含头文件的文件夹,例如 CL/cl.h

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接