[C] неопределенная ссылка при компиляции программы openCL - PullRequest
1 голос
/ 16 июня 2011

Я пытаюсь что-то скомпилировать, чтобы попробовать 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;
}

Я компилирую на win 7 64 с помощью mingw32. Заголовки opencl находятся в каталоге include mingw, в то время как utils.h (внутри каталога Utils внутри каталога prova.c) определяет 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'

Я не очень хорошо разбираюсь в компиляторах, так что я представляю, что мне чего-то не хватает, но я действительно не знаю, что ..

EDIT: С уважением, я попробовал каждую команду прийти в голову. используя -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 не используется. Затем я нахожу util.o и libutil.a (размер 5kb) в Utils и prova.o (размер 1kb). Если я пытаюсь запустить файл prova.o, он говорит, что версия файла несовместима с текущей версией Windows, проверьте версию системы (x86 или x64) и обратитесь к распространителю программного обеспечения

1 Ответ

1 голос
/ 18 июня 2011

Попробуйте что-то вроде этого:

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.a, либо libcoolstuff.so было доступно для поиска в пути к библиотеке (который можно изменить с помощью -L во время компоновки).
...