vckbm tu destroye tout le monde | Salut, je suis sous ubuntu 12.04, gcc 4.6.3 et g++ 4.6.3
j'ai téléchargé la SDK d'AMD: AMD-APP-SDK-v2.9-lnx64
lorsque je compile un example simple (en bas) avec gcc j'ai les erreurs suivantes:
Code :
- >gcc -std=c++0x -o truc truc.cpp -lOpenCL
|
Code :
- truc.cpp:(.text+0x5b): undefined reference to `std::cout'
- truc.cpp:(.text+0x60): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
- truc.cpp:(.text+0xbb): undefined reference to `std::cout'
- truc.cpp:(.text+0xc0): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
- truc.cpp:(.text+0xd2): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& )'
- truc.cpp:(.text+0xdf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
- truc.cpp:(.text+0xee): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
- truc.cpp:(.text+0x13b): undefined reference to `std::cout'
- truc.cpp:(.text+0x140): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
- truc.cpp:(.text+0x19b): undefined reference to `std::cout'
- truc.cpp:(.text+0x1a0): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
- truc.cpp:(.text+0x1b2): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& )'
- truc.cpp:(.text+0x1bf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
- truc.cpp:(.text+0x1ce): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
- truc.cpp:(.text+0x2b9): undefined reference to `std::allocator<char>::allocator()'
- truc.cpp:(.text+0x2d1): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const& )'
|
visiblement il ne prends pas en compte les bibliotheques standards du C++
par contre si je compile avec g++ ça marche:
Code :
- >g++ -std=c++0x -o truc truc.cpp -lOpenCL
|
pourquoi ne reconnait il pas le C++ avec gcc???
EDIT:
il suffit d'ajouter -lstdc++ avec gcc
Code :
- gcc -std=c++0x -o truc truc.cpp -lOpenCL -lstdc++
|
et la ca marche
merci
PS: l'exemple
Code :
- #include <iostream>
- #include <CL/cl.hpp>
- using namespace std;
- int main(){
- //get all platforms (drivers)
- std::vector<cl::Platform> all_platforms;
- cl::Platform::get(&all_platforms);
- if(all_platforms.size()==0){
- std::cout<<" No platforms found. Check OpenCL installation!n";
- exit(1);
- }
- cl::Platform default_platform=all_platforms[0];
- std::cout << "Using platform: "<<default_platform.getInfo<CL_PLATFORM_NAME>()<<"n";
- //get default device of the default platform
- std::vector<cl::Device> all_devices;
- default_platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices);
- if(all_devices.size()==0){
- std::cout<<" No devices found. Check OpenCL installation!n";
- exit(1);
- }
- cl::Device default_device=all_devices[0];
- std::cout<< "Using device: "<<default_device.getInfo<CL_DEVICE_NAME>()<<"n";
- cl::Context context({default_device});
- cl::Program::Sources sources;
- // kernel calculates for each element C=A+B
- std::string kernel_code=
- " void kernel simple_add(global const int* A, global const int* B, global int* C){ "
- " C[get_global_id(0)]=A[get_global_id(0)]+B[get_global_id(0)]; "
- " } ";
- sources.push_back({kernel_code.c_str(),kernel_code.length()});
- cl::Program program(context,sources);
- if(program.build({default_device})!=CL_SUCCESS){
- std::cout<<" Error building: "<<program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device)<<"n";
- exit(1);
- }
- // create buffers on the device
- cl::Buffer buffer_A(context,CL_MEM_READ_WRITE,sizeof(int)*10);
- cl::Buffer buffer_B(context,CL_MEM_READ_WRITE,sizeof(int)*10);
- cl::Buffer buffer_C(context,CL_MEM_READ_WRITE,sizeof(int)*10);
- int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- int B[] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0};
- //create queue to which we will push commands for the device.
- cl::CommandQueue queue(context,default_device);
- //write arrays A and B to the device
- queue.enqueueWriteBuffer(buffer_A,CL_TRUE,0,sizeof(int)*10,A);
- queue.enqueueWriteBuffer(buffer_B,CL_TRUE,0,sizeof(int)*10,B);
- //run the kernel
- cl::KernelFunctor simple_add(cl::Kernel(program,"simple_add";),queue,cl::NullRange,cl::NDRange(10),cl::NullRange);
- simple_add(buffer_A,buffer_B,buffer_C);
- //alternative way to run the kernel
- /*cl::Kernel kernel_add=cl::Kernel(program,"simple_add";);
- kernel_add.setArg(0,buffer_A);
- kernel_add.setArg(1,buffer_B);
- kernel_add.setArg(2,buffer_C);
- queue.enqueueNDRangeKernel(kernel_add,cl::NullRange,cl::NDRange(10),cl::NullRange);
- queue.finish();*/
- int C[10];
- //read result C from the device to array C
- queue.enqueueReadBuffer(buffer_C,CL_TRUE,0,sizeof(int)*10,C);
- std::cout<<" result: n";
- for(int i=0;i<10;i++){
- std::cout<<C[i]<<" ";
- }
- return 0;
- }
|
Message édité par vckbm le 17-04-2014 à 08:47:02 ---------------
A Vendre
|