2011-06-15 93 views
1

我試圖編譯一些嘗試了OpenCL的,但我有一些問題..[C]未定義的引用在編譯的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 '[email protected]' 
C:\[stuff]\ccEjYQbj.o:prova.c:(.text+0x8d): undefined reference to '[email protected]' 
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(size 5kb)。如果我嘗試運行prova.o,它說,該文件版本與當前的Windows版本兼容,檢查系統版本(x86或x64),並聯系軟件分銷商

+4

這是一個鏈接器錯誤,而不是編譯器錯誤。您需要鏈接OpenCL庫。 – 2011-06-15 22:24:32

+1

查看mingw「lib」目錄,看看是否可以找到某種CL庫(可能是名爲「libcl * .a」的東西)。然後通過「-l 」將名稱(減去「lib」和「.a」)傳遞給編譯器。 – 2011-06-16 01:00:31

+0

opencl.h(和所有其他頭文件)位於C:\ Mingw \ include \ CL.I中,在lib文件夾或項目文件夾中的名稱中找不到與opencl或cl相關的內容(opencl相關的)。我知道這是一個noob問題,但我如何編譯頭文件?我一直認爲頭文件不會被編譯,但只有.c/.cpp文件..Ps:我已經嘗試編譯添加-lpath_to_include_folder,但得到了相同的錯誤.PPS:使用cmake腳本爲我從一個小程序獲得它編譯的網絡很好(我需要刪除cl.h的相對路徑,因爲我的標準目錄),所以我的系統中有一切。 – 2011-06-16 12:55:53

回答

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爲f可在庫路徑中使用(可在鏈接時使用-L修改)。
+0

真的很好的解釋!!有了這個我設法編譯了一個非常簡單的項目(我寫了測試它),其中包括一個源包括另一個源,我設法編譯和鏈接他們。但我試着用openCL程序。編譯去了很好,但在鏈接時我得到了「不確定的參考」。我使用了'gcc -W -Wall -c util.c -o util.o \ n cd .. gcc -W -Wall -c prova.c -prova.o gcc -o prova.exe prova.o Utils \ util.o'當然,我仍然缺少添加opencl庫。但他們是在標準的位置(我包括他們與,所以我應該添加什麼?btw謝謝你的幫助! – 2011-06-18 00:21:12

+0

ps:並感謝您澄清使用gcc命令!! – 2011-06-18 00:27:13

+1

@Makers_F:我添加了一些例子如果你使用'-l'語法,你可以使用'-L'指定額外的庫搜索路徑 – 2011-06-18 10:44:17

相關問題