2016-06-27 10 views
0

이 샘플 코드를 컴파일하기 위해 노력 : https://github.com/boostorg/compute/blob/master/README.md부스트 컴퓨팅 (OpenCL을 래퍼), 초기 설정 문제 (QT, g ++)

내가 QT 크리에이터 5.7을 설치 사용은 mingw530

나는

를 사용하여 부스트 라이브러리 컴파일
bootstrap.bat gcc 
b2 install --prefix="C:\Boostbuild" --toolset=gcc 
bjam --build-dir=c:/Dev/Boost/Boost_lib toolset=gcc stage 

나는 AMD SDK 3.0, 2.9.1, 2.9

심지어 다운로드의 OpenCL 1.1, 1.2을 설치하고, 2.1 cl.hpp하고 포함하려고 노력했다.

컴파일이 시작,하지만 난 오류

의 회전을 얻을 C : 데브 \ 부스트 \ 컴퓨팅 마스터 \는 \ 향상을 포함 \ \ 컴퓨팅 \ device.hpp : 80 : 오류 : clRetainDevice`로 정의되지 않은 참조 @ 4 '

는 C : 함수에서`ZN5boost7compute6deviceaSERKS1_ : -1 : 사용자 \ 프로젝트 \ 사용자 \ 문서 \ 빌드 콘솔 테스트 Desktop_Qt_5_7_0_MinGW_32bit - 디버그 \ 디버그 \의 main.o를을 \'

나는 간단한 시도 부스트 계산에 의해 제공되는 코드를 사용하여 Qt 콘솔 앱

참고 :이 나는 또한

적으로는, 내가이 '(아래 참조) MAIN.CPP에 포함의 각각에 -I을하고

g++ -I/path/to/compute/include sort.cpp -lOpenCL 

사용하여이 컴파일을 시도했습니다, QT 특정되지 않습니다 d. 포함 된 모든 라이브러리와 함께 includes 및 all (및 관련 amd sdk 및/또는 opencl 버전)을 사용하여 자신의 페이지에 제공된 예제를 컴파일하는 방법을 알고 싶습니다. 나는이 cl.hpp을 포함 밖으로 주석을 제거하면

내 Qt는 프로젝트 파일 라이브러리

INCLUDEPATH += C:\Dev\Boost\compute-master\include 
INCLUDEPATH += C:/Users/User/Downloads/dev/boost_1_61_0 
INCLUDEPATH += "C:\Program Files (x86)\AMD APP SDK\2.9-1\include" 

내 MAIN.CPP

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <boost/compute.hpp> 
//#define CL_USE_DEPRECATED_OPENCL_1_1_APIS 
//#undef CL_VERSION_1_2 
//#include <C:\Dev\OpenCL\2.1\cl.hpp> 

namespace compute = boost::compute; 

int main() 
{ 

    // get the default compute device 
    compute::device gpu = compute::system::default_device(); 

    // create a compute context and command queue 
    compute::context ctx(gpu); 
    compute::command_queue queue(ctx, gpu); 

    // generate random numbers on the host 
    std::vector<float> host_vector(1000000); 
    std::generate(host_vector.begin(), host_vector.end(), rand); 

    // create vector on the device 
    compute::vector<float> device_vector(1000000, ctx); 

    // copy data to the device 
    compute::copy(
     host_vector.begin(), host_vector.end(), device_vector.begin(), queue 
    ); 

    // sort data on the device 
    compute::sort(
     device_vector.begin(), device_vector.end(), queue 
    ); 

    // copy data back to the host 
    compute::copy(
     device_vector.begin(), device_vector.end(), host_vector.begin(), queue 
    ); 

    return 0; 
} 

, 나는

C:/Dev/Boost/compute-master/include/boost/compute/allocator/buffer_allocator.hpp:91: undefined reference to `[email protected]' 

답변

1

은 "슬루 더 얻을 of errors "는 링크 오류입니다. AMP APP SDK 라이브러리 (libOpenCL.a se)가 누락되었습니다.

예.
-L"C:\Program Files (x86)\AMD APP SDK\2.9-1\lib\x86" -lOpenCL

또는 당신은 당신의 QT .pro 파일에 다음을 추가 할 수 있습니다 : MinGw의 32 비트 버전으로 링크, -lOpenCL이된다

# Ensure that the AMDAPPSDKROOT environment variable has been set 
OPENCL_ROOT = $$(AMDAPPSDKROOT) 
isEmpty(OPENCL_ROOT) { 
    error("Please set AMDAPPSDKROOT to the location of the AMD APP SDK") 
} else { 
    message(Using Boost from: $$OPENCL_ROOT) 
} 

INCLUDEPATH += $$OPENCL_ROOT/include 
LIBS += -L$${OPENCL_ROOT}/lib/x86 
LIBS += -lOpenCL 

참고 : AMDAPPSDKROOT 환경 변수는 일반적으로 만들어 질 때 당신을 AMD APP SDK를 설치하십시오. 귀하의 경우에는 다음과 같이 설정해야합니다 :

C:\Program Files (x86)\AMD APP SDK\2.9-1\ 
+0

변경 사항 : OPENCL_ROOT = "C : \ Program Files (x86) \ AMD APP SDK \ 2.9-1"; LIBS + = -LOpenCL; # cl.hpp C : \ Dev \ Boost \ compute-master \ include \ boost \ compute \ device.hpp를 제외하면 다음과 같습니다 : 91 : error : undefined clReleaseDevice @ 4 참조; cl와 함께.hpp included : C : /Dev/Boost/compute-master/include/boost/compute/allocator/buffer_allocator.hpp : 91 :'clReleaseMemObject @ 4 '에 대한 정의되지 않은 참조 – thistleknot

+0

알겠습니다. 나는 여분의 INCLUDEPATH를 2.9-1로 제거하고 LIBS + = -lOpenCL에 다시 넣었고 cl.hpp에 main에있는 모든 참조를 제거했습니다 (즉, sdk에 포함되어 opencl 헤더를 다운로드 할 필요가 없음). 그리고 컴파일되었습니다. 고맙습니다! – thistleknot

+0

나중에 참조 할 수 있도록 :'-L'은 라이브러리 경로를 추가하는 데 사용되고'-l'은 라이브러리를 추가하는 데 사용됩니다. 그래서'LIBS + = -LOpenCL'을'LIBS + = -lOpenCL'으로 바꾸는 것이 효과가있었습니다. – kenba