您的位置:首页 > 运维架构

GCC: Compiling an OpenCL host on Windows

2014-04-10 18:06 501 查看
I just wanted to try out using OpenCL under Windows.

Abstract: I
got an "
undefined
reference to
" error
 when I tried to compile (using the command 
gcc
my.o -o my.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64" -l OpenCL
).


My Code

#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


Used Programs

MinGW's 
gcc


Visual Studio's 
nmake


AMD's OpenCL™ APP SDK (that's where I took the OpenCL library and the 
CL.h
 file
from)


The Structure of APP SDK's Folders

%>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


Error Message

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.


My Questions

My questions are simple:

Why doesn't my code compile how it is expected to?

What can I do to get rid of this problem?

Thanks.

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.

%>


c gcc compilation mingw opencl
share|improve
this question
edited Sep
15 '12 at 14:53

asked Sep 15 '12 at 13:29





fridojet
416515

 
 
Can you try duplicating the backslashes in the gcc parameters? Like "C:\\Program Files (x86)\\..."? Otherwise they
might get escaped and break the path. Unsure this is the reason but you never know. – Thomas Sep
15 '12 at 15:03 
 
@Thomas Thanks for your idea, but that didn't change anything. –  fridojet Sep
15 '12 at 15:13
 
Does it say something different if you drop the -L parameter and instead give it the full path to OpenCL.lib? So remove
-Lpath and add an unqualified "C:\Program Files (x86)\...\x86_64\OpenCL.lib" to tell gcc "hey here's a file you might find useful"? –  Thomas Sep
15 '12 at 15:16
 
@Thomas Did you mean something like 
gcc
addition.o -o addition.exe "C:\Program Files (x86)\AMD APP\lib\x86_64\OpenCL.lib" -l OpenCL
? –  fridojet Sep
15 '12 at 15:24
1 
Ok, never mind then, the fact that it returned that means it correctly finds the OpenCL library the way you're doing
now - it just fails to link against it. Try -static flag... –  Thomas Sep
15 '12 at 15:36
show 4 more
comments


2 Answers

activeoldestvotes

up
vote4down
voteaccepted
The default MinGW distribution only ships tools for building x86 applications. You cannot link against the x64 version of the OpenCL library. So you either have to use MinGW-w64 or
use the x86 version (change the library path to the x86 subfolder of the APP SDK).

share|improve
this answer
answered Sep 15 '12 at 15:54





reima
1,315310

 
 
That really helped. –  fridojet Sep
15 '12 at 15:59
add
comment





up
vote1down
vote
Try changing
-l OpenCL


to
-lOpenCL


in the compile line.

The 
-l
 option
of gcc expects the name of the library (without the lib prefix) right next to it without any space. Remember using 
-lm
 in
school to link to 
libm
?

share|improve
this answer
answered Sep 15 '12 at 13:48




codaddict
143k28245352

 
 
Thanks for your proposal, but it didn't
change anything
. –  fridojet Sep
15 '12 at 14:44 
 
@fridojet: Can you also drop the space after 
-L
? –  codaddict Sep
15 '12 at 14:47
 
I tried that too, but it didn't help either. Thanks for your idea - Any other one? –  fridojet Sep
15 '12 at 14:49
 
edited
my question
 text in order to describe the reactions on running the Makefile after dropping the spaces. –  fridojet Sep
15 '12 at 14:55 
 
You have also changed the library path to C:\prog-x86\AMD-APP\lib\x86_64. Are you sure the libraries are there ? –  codaddict Sep
15 '12 at 15:00
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: