GCC: компиляция хоста OpenCL в Windows

Я просто хотел попробовать использовать OpenCL под Windows.

Аннотация: При попытке компиляции (с помощью команды gcc my.o -o my.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64" -l OpenCL) у меня возникла ошибка "undefined reference to".


Мой код

#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: addition

addition:
    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

Используемые программы

  • gcc MinGW
  • nmake Visual Studio
  • OpenCL ™ APP SDK от AMD (откуда я взял библиотеку OpenCL и файл CL.h)

Структура папок APP SDK

%>tree /F "C:\Program Files (x86)\AMD APP\lib\x86_64"
Auflistung der Ordnerpfade
Volumeseriennummer : D2DC-D765
C:\PROGRAM FILES (X86)\AMD APP\LIB\X86_64
    libOpenCL.a
    OpenCL.lib
    OpenVideo64.lib

Es sind keine Unterordner vorhanden


%>tree /F "C:\Program Files (x86)\AMD APP\include"
Auflistung der Ordnerpfade
Volumeseriennummer : D2DC-D765
C:\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

Сообщение об ошибке

        gcc addition.o -o addition.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64" -l OpenCL
addition.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 status
NMAKE : fatal error U1077: "C:\prog-x86\MinGW\bin\gcc.EXE": Rückgabe-Code "0x1"
Stop.

Мои вопросы

Мои вопросы просты:

  • Почему мой код не компилируется так, как ожидается?
  • Что я могу сделать, чтобы избавиться от этой проблемы?

Спасибо.


ОБНОВЛЕНИЕ: сообщение об ошибке после удаления пробелов, как описано в ответе @codaddict.

(Makefile)

all: addition

addition:
  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)

%>nmake

Microsoft (R) Program Maintenance Utility, Version 11.00.50727.1
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.

        gcc -c -I "C:\Program Files (x86)\AMD APP\include" addition.c -o addition.o
addition.c: In function 'main':
addition.c:14:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by d
efault]
addition.c:23:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by d
efault]
        gcc addition.o -o addition.exe -LC:\prog-x86\AMD-APP\lib\x86_64 -lOpenCL
addition.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 status
NMAKE : fatal error U1077: "C:\prog-x86\MinGW\bin\gcc.EXE": Rückgabe-Code "0x1"
Stop.

%>

person fridojet    schedule 15.09.2012    source источник
comment
Можете попробовать продублировать обратную косую черту в параметрах gcc? Как C: \ Program Files (x86) \ ...? В противном случае они могут сбежать и сломать путь. Не уверен, что это причина, но никогда не знаешь.   -  person Thomas    schedule 15.09.2012
comment
@Thomas Спасибо за идею, но это ничего не изменило.   -  person fridojet    schedule 15.09.2012
comment
Говорит ли он что-то другое, если вы отбрасываете параметр -L и вместо этого даете ему полный путь к OpenCL.lib? Так что удалите -Lpath и добавьте неквалифицированный C: \ Program Files (x86) \ ... \ x86_64 \ OpenCL.lib, чтобы сообщить gcc, вот файл, который может вам пригодиться?   -  person Thomas    schedule 15.09.2012
comment
@Thomas Вы имели в виду что-то вроде gcc addition.o -o addition.exe "C:\Program Files (x86)\AMD APP\lib\x86_64\OpenCL.lib" -l OpenCL?   -  person fridojet    schedule 15.09.2012
comment
@Thomas gcc ответы на указанную выше команду: c:/prog-x86/ [...] /mingw32/bin/ld.exe: cannot find -lOpenCL - collect2: ld returned 1 exit status   -  person fridojet    schedule 15.09.2012
comment
Хорошо, тогда неважно, тот факт, что он вернулся, означает, что он правильно находит библиотеку OpenCL так, как вы делаете сейчас - он просто не может ссылаться на нее. Попробуйте -статический флаг ...   -  person Thomas    schedule 15.09.2012
comment
Спасибо за предложение - но gcc addition.o -o addition.exe -L "C:\Program Files (x86)\AMD APP\lib\x86_64\" -l OpenCL -Wl,-static тоже не помогает. Ошибка undefined reference все еще существует. - А ты знаешь, как я мог бы справиться с этой проблемой по-другому?   -  person fridojet    schedule 15.09.2012
comment
позвольте нам продолжить это обсуждение в чате   -  person Thomas    schedule 15.09.2012


Ответы (3)


В дистрибутив MinGW по умолчанию входят только инструменты для создания приложений x86. Вы не можете ссылаться на версию x64 библиотеки OpenCL. Поэтому вам нужно либо использовать MinGW-w64, либо использовать версию x86 (измените путь библиотеки к подпапке x86 APP SDK).

person reima    schedule 15.09.2012

Попробуйте изменить

-l OpenCL

to

-lOpenCL

в строке компиляции.

Параметр -l gcc ожидает имя библиотеки (без префикса lib) рядом с ней без пробелов. Помните, как в школе использовалось -lm для ссылки на libm?

person codaddict    schedule 15.09.2012
comment
Спасибо за ваше предложение, но оно ничего не изменило. - person fridojet; 15.09.2012
comment
@fridojet: Можете ли вы также отбросить пробел после -L? - person codaddict; 15.09.2012
comment
Я тоже пробовал, но это тоже не помогло. Спасибо за идею - Есть еще одна? - person fridojet; 15.09.2012
comment
Я отредактировал текст своего вопроса, чтобы описать реакцию на запуск Makefile после удаления пробелов. - person fridojet; 15.09.2012
comment
Вы также изменили путь к библиотеке на C: \ prog-x86 \ AMD-APP \ lib \ x86_64. Вы уверены, что библиотеки есть? - person codaddict; 15.09.2012
comment
Да, C:\prog-x86\AMD-APP\lib\x86_64 - это просто символическая ссылка для C:\Program Files (x86)\AMD APP\lib\x86_64 в моей системе, потому что некоторым сценариям оболочки не требуется места в пути к файлу. - person fridojet; 15.09.2012
comment
Спасибо за ваше пристальное внимание. - Теперь я тоже попробовал скрипт без пробелов после имени опции, но со старыми путями. - person fridojet; 15.09.2012
comment
Между прочим: сначала я попробовал использовать некоторые пробелы, потому что die говорит < / b>, что это тоже нормально. Итак, теоретически это не должно иметь никакого значения. - person fridojet; 15.09.2012

64-битный компилятор g ++ в Windows 10 также находится в папке bin:

"C:\MinGW\bin\x86_64-w64-mingw32-g++.exe"

Так что это работает для меня:

C:\MinGW\bin>x86_64-w64-mingw32-g++ "C:\Users\...\main.cpp" -o
C:\Users\...\saxpy  -L "C:\Program Files\...\x64" -lOpenCL -I
"C:\...\OpenCL\sdk\include"

Примечания:

  1. -o имя вывода
  2. -L папка содержит OpenCL.lib
  3. -I папка содержит файл заголовка, например CL / cl.h
person Harry    schedule 23.03.2020