编译openCL程序时[C]未定义引用

时间:2011-06-15 22:18:27

标签: c include compilation opencl

我正在尝试编译一些东西来试用openCl,但我遇到了一些问题..

这里是代码

prova.c

#include <stdio.h>
#include <CL/opencl.h>
#include "Utils\util.h"
#include <malloc.h>

int main(){
    cl_int error = 0;   // Used to handle error codes
    cl_int max_platforms = 1; // The maximum number of platforms
    cl_uint adviable_platforms = 0; //The adviable number of platforms
    cl_platform_id* platform;

    error = clGetPlatformIDs(0, NULL, &adviable_platforms);
    if(adviable_platforms == 0)
    {
        printf("No adviable platforms.\n");
        return -1;
    } else {
        platform = (cl_platform_id*)malloc(adviable_platforms * sizeof(cl_platform_id));
    }

    error = clGetPlatformIDs(adviable_platforms, platform, NULL);


    printf("clGetPlatformIDs: %s\n", clErrorString(error));
    return 0;
}

我正在使用mingw32在win 7 64上进行编译。 opencl头文件位于mingw的include目录中,而utils.h(在prova.c目录下的Utils目录内)定义了clErrorString(它只是将错误转换为更易读的字符串)。

编译我使用

gcc -L\Utils prova.c

但我总是得到

C:\[stuff]\ccEjYQbj.o:prova.c:(.text+0x42): undefined reference to 'clGetPlatformIDs@12'
C:\[stuff]\ccEjYQbj.o:prova.c:(.text+0x8d): undefined reference to 'clGetPlatformIDs@12'
C:\[stuff]\ccEjYQbj.o:prova.c:(.text+0x9e): undefined reference to 'clErrorString'

我对编译器不是很好,所以我想我错过了一些东西,但我真的不知道是什么......

编辑: 真诚地,我尝试了每一个命令。使用-L包含目录,-l链接到文件,使用ar ..

这是我试过的最后一个“脚本”

set PATH=%PATH%;C:\Python26;C:\MinGW\bin;C:\MinGW\lib

cd Utils
gcc -c util.c -l"C:\Program Files (x86)\AMD APP\lib\x86_64\libOpenCL.a" -o util.o
ar rcs libutil.a util.o

cd..
pause

gcc -c prova.c -l"Utils\libutil.a" -o prova.exe

pause

EDIT2:

@echo off
set PATH=%PATH%;C:\Python26;C:\MinGW\bin;C:\MinGW\lib

cd Utils
gcc -Wall -c util.c -L"C:\Program Files (x86)\AMD APP\lib\x86_64\" -o util.o
ar rcs libutil.a util.o

cd..
pause

gcc -Wall -c prova.c -L"C:\Program Files (x86)\AMD APP\lib\x86_64\" -l"Utils\libutil.a" -o prova.exe

pause

没有错误,唯一的警告是max_platform未使用。然后我在Utils和prova.o(大小为1kb)中找到util.o和libutil.a(大小为5kb)。如果我尝试运行prova.o,它表示文件版本与当前的Windows版本不兼容,请检查系统版本(x86或x64)并联系软件分销商

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

set PATH=%PATH%;C:\Python26;C:\MinGW\bin;C:\MinGW\lib

cd Utils
gcc -W -Wall -c util.c -o util.o
ar rcs libutil.a util.o

cd..

gcc -W -Wall -c prova.c -o prova.o
gcc -o prova.exe prova.o Utils\libutil.a

# Using a standard library
gcc -o prog.exe myprog.o -lzip  # e.g. /usr/lib/libz.a

# Using a nonstandard library
gcc -o prog.exe myprog.o -lfoo -L/tmp/libfoo  # uses /tmp/libfoo/libfoo.a
gcc -o prog.exe myprog.o /tmp/libfoo/libfoo.a # same effect

一般来说:

  • 使用-c编译单个源文件:
    gcc -c myfile.c -o myfile.o
    这会创建对象文件。

  • 将所有目标文件链接到可执行文件(或共享库):
    gcc -o prog.exe myfile.o yourstuff.o sha257.o

  • 您可以将目标文件合并到静态库中,在链接时您将其视为单个目标文件:
    ar rcs libcoolstuff.a yourstuff.o sha257.o
    gcc -o prog.exe myfile.o libcoolstuff.a
    或者:
    gcc -o prog.exe myfile.o -lcoolstuff
    后一种语法(自动库与-l链接)要求libcoolstuff.alibcoolstuff.so可以找到库路径(您可以在链接时使用-L进行修改)。