SDK — ошибка связывания с использованием исходной библиотеки AMD

Привет Дорогой Интернет,

Итак, я скачал найденную библиотеку clAmdFft Вот.

Я также пошел вперед и сделал этот, (добавление исходных файлов / библиотек в пути компилятора / системы). Вот они по факту:

echo $LIBRARY_PATH
/usr/lib:/opt/clAmdFft-1.10.321/lib64:/usr/lib:
echo $C_INCLUDE_PATH
/opt/clAmdFft-1.10.321/include:
echo $LD_LIBRARY_PATH
/opt/clAmdFft-1.10.321/lib64:/opt/clAmdFft-1.10.321/lib32:/usr/lib:/usr/local/cuda/lib64:/usr/local/cuda/lib::/opt/clAmdFft-1.10.321

Вот вершина одного из .cpp файлов, в которых я хотел бы использовать эту библиотеку:

// AMD APPML FFT
#include <clAmdFft.h>
// IVE TRIED THESE TOO
//#include "clAmdFft.h"//#include <clAmdFft>

И, наконец, вот мой сахарный сладкий Makefile, (ничего сложного здесь, я делал это так последовательно раньше)

#
#
#  Compile Super Mega Awesome Program For Winners
#
#
#

# -std=c++0x is required for using <chrono>

objects =  L1.o L2.o L3.o
sharedObjects = SL1.so
exec = SL1
GCC=gcc
GPP=g++
CFLAGS= -I /usr/local/cuda/include -g
LDFLAGS = -L /usr/lib -lOpenCL

# This apparently addresses linking problems w/ clAmdFft & NVIDIA drivers
LDFLAGS += -Wl,--unresolved-symbols=ignore-in-shared-libs

SL1:
$(GPP) $(CFLAGS) -o L1.o -c -std=c++0x -fPIC main.cpp
$(GPP) $(CFLAGS) -o L2.o -c -fPIC L2.cpp
$(GPP) $(CFLAGS) -o L3.o -c -fPIC L3.cpp
$(GPP) $(CFLAGS) -Wall -shared  -o $(sharedObjects) $(objects)
$(GPP) $(sharedObjects) -o $(exec) -g $(LDFLAGS)

.PHONY : clean
clean:
rm $(objects) $(sharedObjects) $(exec)#EOF

Почему тогда, дорогой Интернет, я получаю следующую ошибку?

L3.cpp:24:22: fatal error: clAmdFft.h: No such file or directory
compilation terminated.

Я имею в виду, это кажется очень простым. После быстрого просмотра этого сайта, а также Google в целом, я не могу найти твердый ответ о том, почему это не работает правильно мяу. Надеюсь, вы, ребята, можете помочь! Благодарю.

0

Решение

Как и в комментарии, добавление -I /opt/clAmdFft-1.10.321/include к CFLAGS= -I /usr/local/cuda/include -g мой любимый способ решения этой конкретной проблемы.

Что касается того, как использовать C_INCLUDE_PATH, технически вы используете правильно — за исключением того, что вы не компилируете код с gcc но с g++ и, таким образом, вы должны использовать CPLUS_INCLUDE_PATH,

Вот пример компиляции (не показывается мой сеанс xemacs, создающий test.cpp и testing.h — testing.cpp просто делает #include <testing.h> (который содержит простое определение, которое я печатаю).

$ mkdir ../testing
$ export C_INCLUDE_PATH=../testing
$ g++ -Wall testing.cpp
testing.cpp:2:21: fatal error: testing.h: No such file or directory
compilation terminated.
$ export CPLUS_INCLUDE_PATH=../testing
$ g++ -Wall testing.cpp

Тем не менее, весь смысл использования make-файлов заключается в том, что они определяют, что вы включаете откуда. Использование глобальных переменных среды приведет к вашему проекту в зависимости от того, что каждый пользователь в системе настроил C_INCLUDE_PATH а также CPLUS_INCLUDE_PATH,

Аналогично, если вы в конечном итоге перенесете свой проект с одного компьютера на другой, если все пути включения и т. Д. Находятся в make-файле, вы можете просто скопировать файлы проекта [и, конечно, установить зависимости — хотя вы МОЖЕТЕ иметь makefile делает то же самое, если вы над этим работаете]. Если вы полагаетесь на CPLUS_INCLUDE_PATH и тому подобное, вам в конечном итоге придется также отредактировать ваш .bashrc или что-то еще.

(И сегодня я узнал что-то новое, я даже не знал, что эти переменные среды существуют).

1

Другие решения

Других решений пока нет …