GCC: Compiling an OpenCL host on Windows

来源:互联网 发布:linux telnet ip 端口 编辑:程序博客网 时间:2024/06/06 00:53

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: additionaddition:    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 OrdnerpfadeVolumeseriennummer : D2DC-D765C:\PROGRAM FILES (X86)\AMD APP\LIB\X86_64    libOpenCL.a    OpenCL.lib    OpenVideo64.libEs sind keine Unterordner vorhanden%>tree /F "C:\Program Files (x86)\AMD APP\include"Auflistung der OrdnerpfadeVolumeseriennummer : D2DC-D765C:\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 OpenCLaddition.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 statusNMAKE : 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: additionaddition:  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)

%>nmakeMicrosoft (R) Program Maintenance Utility, Version 11.00.50727.1Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.        gcc -c -I "C:\Program Files (x86)\AMD APP\include" addition.c -o addition.oaddition.c: In function 'main':addition.c:14:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]addition.c:23:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]        gcc addition.o -o addition.exe -LC:\prog-x86\AMD-APP\lib\x86_64 -lOpenCLaddition.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 statusNMAKE : fatal error U1077: "C:\prog-x86\MinGW\bin\gcc.EXE": Rückgabe-Code "0x1"Stop.%>
share|improve this question
 
 
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
 
 
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
 
 
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
 
I 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
0 0
原创粉丝点击