【发布时间】:2011-06-15 22:18:27
【问题描述】:
我正在尝试编译一些东西来试用 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(size 1kb) 中找到了 util.o 和 libutil.a(size 5kb)。如果我尝试运行 prova.o,它说文件版本与当前的 windows 版本不兼容,请检查系统版本(x86 或 x64)并联系软件经销商
【问题讨论】:
-
这是一个链接器错误,而不是编译器错误。您需要在 OpenCL 库中进行链接。
-
查看 mingw "lib" 目录,看看是否可以找到某种 CL 库(可能是名为 "libcl*.a" 的东西)。然后通过“-l
”将名称(减去“lib”和“.a”)传递给编译器。 -
@Makers_F:你确定你的最后一条命令吗?
-l采用库名称,而不是目录,你在想-L吗?而且您仍然没有链接到 opencl 库。 -
@Makers:如果您的最后一行指示正确的相对位置,请尝试
gcc -c prova.c "Utils\libutil.a" -o prova.exe。您不需要将-l用于静态库,您只需像普通目标文件一样指定它们。 (如果你说-lname,链接器会查找文件libname.a或libname.so。) -
@Makers_F:“它没有链接”是什么意思?您是否收到任何错误,以及来自哪个程序?也许您可以发布您执行的操作的更详细的输出?
标签: c include compilation opencl