Project update


[Embedded System]ARM端 開DSP記憶體 memory alloc

posted Apr 17, 2013, 1:41 AM by 范景棠

一般只用Memory_contigAlloc 
但若要用cache,可能得用Memory_cacheWb 


Codec Engine OSAL - Memory

Data Structures

struct  Memory_AllocParams
 Parameters for Memory_alloc() & Memory_free()More...

Defines

#define Memory_DEFAULTALIGNMENT   ((UInt)(-1))
#define Memory_GTNAME   "OM"
#define Memory_CACHED   0x00000000
#define Memory_NONCACHED   0x00000001
#define Memory_CACHEDMASK   0x00000001

Enumerations

enum  Memory_type { 
  Memory_MALLOC = 0, 
  Memory_SEG = 1, 
  Memory_CONTIGPOOL = 2, 
  Memory_CONTIGHEAP = 3 
}
 

Enum values for Memory_AllocParams.type.

More...

Functions

Ptr Memory_alloc (UInt size, Memory_AllocParams *params)
 General memory allocation. 
Void Memory_cacheInv (Ptr addr, Int sizeInBytes)
 Invalidate a range of cache. 
Void Memory_cacheWb (Ptr addr, Int sizeInBytes)
 Write back cache. 
Void Memory_cacheWbInv (Ptr addr, Int sizeInBytes)
 Write back and invalidate cache. 
Ptr Memory_contigAlloc (UInt size, UInt align)
 Allocate physically contiguous blocks of memory. 
Bool Memory_contigFree (Ptr addr, UInt size)
 Free memory allocated by Memory_contigAlloc()
Bool Memory_free (Ptr addr, UInt size, Memory_AllocParams *params)
 Free memory allocated with Memory_alloc()
Void Memory_dumpKnownContigBufsList (Void)
 Dumps the list of all translated/registered bufs. 
UInt32 Memory_getBufferPhysicalAddress (Ptr virtualAddress, Int sizeInBytes, Bool *isContiguous)
 Converts application virtual address to a physical address. 
Int Memory_getHeapId (String name)
 Get the heap heap ID corresponding to a heap name. This number will be between 0 and the value returned by Memory_getNumHeaps(). The heap Id can be passed to Memory_redefine(), Memory_restoreHeap(), and Memory_segStat(). 
Int Memory_getNumHeaps ()
 Get the number of memory heaps. 
Ptr Memory_getBufferVirtualAddress (UInt32 physicalAddress, Int sizeInBytes)
 Obtains the virtual address of a physically contiguous buffer. 
Void Memory_registerContigBuf (UInt32 virtualAddress, UInt32 sizeInBytes, UInt32 physicalAddress)
 Register a physical buffer allocated without Memory_contigAlloc()
Void Memory_unregisterContigBuf (UInt32 virtualAddress, UInt32 sizeInBytes)
 Unregisters a physical buffer allocated without Memory_contigAlloc()

Variables

Memory_AllocParams Memory_DEFAULTPARAMS
 Default parameters for Memory_alloc() & Memory_free()

Define Documentation

#define Memory_DEFAULTALIGNMENT   ((UInt)(-1))
#define Memory_GTNAME   "OM"
#define Memory_CACHED   0x00000000

Cached allocation.

See also:
Memory_AllocParams.flags
#define Memory_NONCACHED   0x00000001

Non-cached allocation.

See also:
Memory_AllocParams.flags
#define Memory_CACHEDMASK   0x00000001

Mask to isolate cache flag.

See also:
Memory_AllocParams.flags

Enumeration Type Documentation

Enum values for Memory_AllocParams.type.

See also:
Memory_AllocParams
Enumerator:
Memory_MALLOC 

malloc()-based allocation

Memory_SEG 

DSP/BIOS segment-based allocation

Memory_CONTIGPOOL 

Contiguous, pool-based allocation

Memory_CONTIGHEAP 

Contiguous, heap-based allocation


Function Documentation

Ptr Memory_alloc(UInt size,
Memory_AllocParams * params 
)

General memory allocation.

Parameters:
[in] size Number of bytes to allocate.
[in] params Parameters controlling the allocation.
Return values:
NULL The memory request failed.
non-NULL The pointer to a buffer containing the requested memory.
See also:
Memory_free()
Memory_contigAlloc()
Void Memory_cacheInv(Ptr addr,
Int sizeInBytes 
)

Invalidate a range of cache.

Parameters:
[in] addr Address of the beginning of the buffer to invalidate.
[in] sizeInBytes Size of the buffer to invalidate.
Remarks:
In addition to application usage, this is often called by a skeleton implementor after it has received a shared memory buffer from another processor, and before it invokes an algorithm's interface which will operate on that shared memory buffer.
See also:
Memory_cacheWb()
Memory_cacheWbInv()
Void Memory_cacheWb(Ptr addr,
Int sizeInBytes 
)

Write back cache.

Parameters:
[in] addr Address of the beginning of the buffer to writeback.
[in] sizeInBytes Size of the buffer to writeback.
See also:
Memory_cacheInv()
Memory_cacheWbInv()
Void Memory_cacheWbInv(Ptr addr,
Int sizeInBytes 
)

Write back and invalidate cache.

Parameters:
[in] addr Address of the beginning of the buffer to writeback and invalidate.
[in] sizeInBytes Size of the buffer to writeback invalidate.
See also:
Memory_cacheInv()
Memory_cacheWb()
Ptr Memory_contigAlloc(UInt size,
UInt align 
)

Allocate physically contiguous blocks of memory.

Deprecated:
This function has been superceded by Memory_alloc() and will be removed in a future release. Users are recommended to modify their applications to use the new, more flexibleMemory_alloc() instead.
Parameters:
[in] size Size of the buffer to allocate.
[in] align Alignment of the buffer; must be divisible by a power of two.
Precondition:
align must be divisible by a power of two.
Return values:
non-NULL Address of a physically contiguous buffer.
NULL Unable to obtain the requested buffer.
Remarks:
This is commonly called by an application wishing to obtain a physically contiguous buffer which it must share with another processor.
For portability reasons, applications commonly use this API even in environments which do not have virtual memory or an MMU (e.g. a single processor, DSP/BIOS based system). Doing so makes them portable to environments which do have to provide physically contiguous memory to remote processors.
See also:
Memory_alloc()
Memory_contigFree()
Bool Memory_contigFree(Ptr addr,
UInt size 
)

Free memory allocated by Memory_contigAlloc().

Parameters:
[in] addr Address of a buffer allocated by Memory_contigAlloc()
[in] size Size of the buffer to free.
Return values:
TRUE The buffer was freed and the memory pointed to by addr is no longer valid.
FALSE The buffer couldn't be freed.
Precondition:
addr must be a valid address returned by Memory_contigAlloc()
size must be equivalent to the size passed in during the Memory_contigAlloc() allocation.
See also:
Memory_contigAlloc()
Bool Memory_free(Ptr addr,
UInt size,
Memory_AllocParams * params 
)

Free memory allocated with Memory_alloc().

Parameters:
[in] addr Address of a buffer allocated by Memory_alloc().
[in] size Size of the buffer to free.
[in] params Parameters controlling the free operation.
Return values:
TRUE The buffer was freed and the memory pointed to by addr is no longer valid.
FALSE The buffer couldn't be freed.
Precondition:
addr must be a valid address returned by Memory_alloc().
size must be equivalent to the size passed in during the Memory_alloc() allocation.
See also:
Memory_alloc()
Void Memory_dumpKnownContigBufsList(Void  ) 

Dumps the list of all translated/registered bufs.

Remarks:
The list is printed using the tracing infrastructure at trace level 5 to tracemask Memory_GTNAME.
There are several mechanisms to enable this trace mask, one would be to do the following from your application:
    GT_set(Memory_GTNAME "+5");
See also:
Memory_registerContigBuf()
Memory_unregisterContigBuf()
UInt32 Memory_getBufferPhysicalAddress(Ptr virtualAddress,
Int sizeInBytes,
Bool * isContiguous 
)

Converts application virtual address to a physical address.

This API also checks verifies that the buffer is really contiguous.

Parameters:
[in] virtualAddress Address of a buffer.
[in] sizeInBytes Size of the buffer.
[out] isContiguous Optional flag indicating whether the buffer was physically contiguous or not.
Return values:
0 Failure, the physical address could not be obtained.
non-zero The physical address of the buffer.
Remarks:
sizeInBytes must be non-zero.
isContiguous is an optional parameter, and can be NULL if the caller doesn't want the results of this check. If isContiguous is NULL but the buffer is not contiguous, error trace will be generated.
If a physically discontiguous buffer is provided in virtualAddress, zero will be returned. And if isContiguous is non-null, it will be set to FALSE.
This is typically called by a stub implementation to translate an application-side virtual address into a physical address usable by a remote skeleton and algorithm.
To enable portable code, this is safe to call on systems without virtual memory. In those cases, the returned physical buffer will be the same as the provided "virtual" buffer.
See also:
Memory_getBufferVirtualAddress()
Int Memory_getHeapId(String name ) 

Get the heap heap ID corresponding to a heap name. This number will be between 0 and the value returned by Memory_getNumHeaps(). The heap Id can be passed to Memory_redefine(), Memory_restoreHeap(), and Memory_segStat().

Remarks:
This is an unsupported, private function. There is no contract to provide compatibility between releases, and it may be deleted at any time.
Return values:
>= 0 The heap number.
< 0 No heap with the given name was found.
See also:
Memory_getNumHeaps()
Int Memory_getNumHeaps( ) 

Get the number of memory heaps.

Remarks:
This is an unsupported, private function. There is no contract to provide compatibility between releases, and it may be deleted at any time.
Return values:
The number of memroy heaps.
See also:
Memory_getHeapId()
Ptr Memory_getBufferVirtualAddress(UInt32 physicalAddress,
Int sizeInBytes 
)

Obtains the virtual address of a physically contiguous buffer.

Parameters:
[in] physicalAddress Physical address of a buffer.
[in] sizeInBytes Size of the buffer.
Return values:
NULL Failure, the virtual address could not be obtained.
non-zero The virtual address of the buffer.
Remarks:
sizeInBytes must be non-zero.
If virtualAddress, was not acquired by Memory_getBufferPhysicalAddress(), no attempt is made to map the physically contiguous buffer into a the application's virtual memory space.
This is typically called by a stub implementation to translate a buffer provided by a remote skeleton and/or algorithm into an application-usable, virtual address.
To enable portable code, this is safe to call on systems without virtual memory. In those cases, the returned "virtual" buffer will be the same as the provided physical buffer.
See also:
Memory_getBufferPhysicalAddress()
Void Memory_registerContigBuf(UInt32 virtualAddress,
UInt32 sizeInBytes,
UInt32 physicalAddress 
)

Register a physical buffer allocated without Memory_contigAlloc().

Parameters:
[in] virtualAddress Address of the buffer mapped into the process space
[in] sizeInBytes Size of the region
[in] physicalAddress Physical address of the buffer
Remarks:
A cache of "app-address to codec-address" mappings (e.g. virtual to physical address mappings in DM644x devices) is internally maintained in some environments (e.g. Linux). This is used, for example, by Memory_getBufferPhysicalAddress() and Memory_getBufferVirtualAddress(). This lookup map is automatically updated when using Memory_contigAlloc()and Memory_contigFree(). However, if the user acquires buffers independently, it must use Memory_registerContigBuf() and Memory_unregisterContigBuf() to ensure the lookup map is current.
Individual sub-blocks of a buffer need not be registered; registering the entire buffer once will suffice.
This API is typically only required for environments with virtual memory (e.g. Linux-based systems).
See also:
Memory_unregisterContigBuf()
Memory_dumpKnownContigBufsList()
Void Memory_unregisterContigBuf(UInt32 virtualAddress,
UInt32 sizeInBytes 
)

Unregisters a physical buffer allocated without Memory_contigAlloc().

Parameters:
[in] virtualAddress beginning address of the buffer mapped into the process space
[in] sizeInBytes size of the region
Remarks:
This API must be used to unregister a buffer allocated outside of Memory_contigAlloc() if the buffer (or a portion of it) is passed on to VISA calls. Segments of the buffer need not be individually unregistered.
See also:
Memory_registerContigBuf()
Memory_dumpKnownContigBufsList()

Variable Documentation

Default parameters for Memory_alloc() & Memory_free().

Remarks:
Memory_DEFAULTPARAMS will be used when NULL is passed in the Memory_AllocParams parameter for Memory_alloc() & Memory_free(). When passing a non-NULLMemory_AllocParams parameter, you should first copy Memory_DEFAULTPARAMS to your structure and then modify individual elements as needed:
See also:
Memory_alloc()
Memory_free()

Copyright 2010, Texas Instruments Incorporated

[C/C++ Library] boost

posted Apr 6, 2013, 12:59 AM by 范景棠

下載位置: http://www.boost.org/: 
目前版本: 1.53.0

Boost C++ Libraries

Boost C++ 函式庫(Libraries)是一組擴充C++功能性的經過同行評審(Peer-reviewed)且開放原始碼程式庫。大多數的函式為了能夠以開放原始碼、封閉專案的方式運作,而授權於Boost軟體授權條款(Boost Software License)之下。許多Boost的開發人員是來自C++標準委員會,而部份的Boost函式庫成為C++的TR1標準之一。[1]

為了要確保函式庫的效率與彈性,Boost廣泛的使用模板(template)功能。而它是針對各式領域的C++使用者與應用領域(Application Domain)上,包含的函式庫型別從像smart_ptr 函式庫這種類通用函式庫,到像是檔案系統作業系統抽象層,甚至能夠利用Boost來開發額外的函式庫或是給進階的C++使用者利用,像是MPL


Boost包含功能甚多,例如:多執行緒、向量與矩陣形運算、......等,本篇不多做功能介紹,需要請自行探索。
下面說明編譯方式。

我的Boost解壓縮後放在: C:\SDK\boost_1_53_0


裡面方式不少,建議直接看: 5.3 Or, Build Binaries From Source
可以用Boost.CMake方式來編譯,也可以直接照5.3.1, 5.3.2, ......步驟 (我用後面這種)


之後有更具體的使用需求,再來補說明。



20130124-Betty-Person re-id math

posted Jan 28, 2013, 2:16 AM by 童筱蓉

  • 本週進度
    •   公式
      Histogram
      Spatial covariance
      Feature
      Relevance 
  • 下週進度

20130117-gen-PartBasedDetector building and test

posted Jan 17, 2013, 5:32 AM by 陳建儒

本週進度:
    PartBasedDetector linux編譯完成

為了確認這個程式執行結果無誤,而且可以移植windows,因此我先直接重開64位元的ubuntu環境,直接給6GB memory來解決memory leak

重編後成功執行完結果如下,與matlab版本執行結果仍有兩點差異:
  1. c++版本似乎只會顯示偵測率最高的人臉
  2. c++版本沒有直接算出一張人臉的角度
接下來再了解一下角度資訊如何抓出,及編譯時加入openMP

實驗數據如下:
test image resolution: 1024*768
detection model: Face_small_146filter.xml
maximam use memory: 3.7GB
detection time:  441.264427 s
以下為重編64位元ubuntu時要再安裝的一些library:
  1. Gtk與Qt編譯環境安裝與配置 http://goo.gl/knOvj
  2. sudo apt-get install build-essential
    sudo apt-get install gnome-devel gnome-devel-docs
    
    sudo apt-get install libqt4-dev qt4-designer qt4-doc
    sudo apt-get install kde4-devel
    sudo aptitude install kdevelop-kde4
  3. install python http://goo.gl/Pf2kP
  4. sudo add-apt-repository ppa:fkrull/deadsnakes
    sudo apt-get update
    sudo apt-get install python3.2


以下為嚐試從程式解問memory leak的一些解法,不過失敗了.....

上週memory leak問題,追到原因有兩個:
1. dynamicProgram.cpp 中在第二~三層迴圈內宣告cv:Mat變數
[demo.cpp- line 112 ]pbd.detect(im, candidates); >> [PartBasedDetector.cpp- line 87] dp_.min(parts_, pdf, Ix, Iy, Ik,         rootv, rooti); >> [DynamicProgram.cpp - line 112-174]
2. DynamicProgram.cpp 中 line154, line 160-161在每次迴圈都呼叫 match.hpp,並在裡面對cv::Mat maxv,maxi,Ixm,Iym變數配置記憶體,記憶體大小依每次迴圈而變 
 Math::reduceMax<T>(weighted, maxv, maxi);
Math::reducePickIndex<int>(Ixp, maxi, Ixm);
Math::reducePickIndex<int>(Iyp, maxi, Iym);


對第一個問題用static解決,但輸出偵測結果有錯
因此對第二個問題,修改成第一次迴圈後不create記憶體,而是resize調整記憶體大小,如下
// allocate the output array
if( !out.empty )
out.create(in[0].size(), in[0].type());//原本只有這行
else
out.resize(in[0].cols);
但結果還是有誤........因此只好改解決方向

20130117-Betty-Person re-id math

posted Jan 17, 2013, 12:10 AM by 童筱蓉

  • 本週進度
    •   公式
      Histogram
      Spatial covariance
      Feature
      Relevance 
  • 下週進度
簡報連結:

20130110-David-驗證Chnftrs的十個特徵圖

posted Jan 13, 2013, 10:13 AM by 梁仲偉

1、驗證ChnFtrs的十個特徵圖
     簡報連結:
     
2、本週程式檔案:
     驗證ChnFtrs的LUV特徵圖、1X3和3X1 mask的特徵圖、sobel的3X3及5X5以及7X7的特徵圖、Scharr的3X3的特徵圖。
     此外加入Prewitt特徵圖的偵測方法。
     程式檔案連結:
      

20130110-Betty-Image Selection

posted Jan 10, 2013, 3:19 AM by 童筱蓉

1.Background subtraction(100%)
Background removal
Image selection
程式連結:
2.公式(25%)
Histogram quantization
Spatial covariance
Histogram matching

簡報連結:

2010-0110-gen-PartBasedDetector install

posted Jan 10, 2013, 2:57 AM by 陳建儒

安裝完所需3rd party library
configure 成功後,輸入make
在link時出現error:
Linking CXX executable PartsBasedDetector
CMakeFiles/PartsBasedDetector_bin.dir/demo.cpp.o: In function `__static_initialization_and_destruction_0':
/home/islab/workdir/library/boost/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/home/islab/workdir/library/boost/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/home/islab/workdir/library/boost/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
CMakeFiles/PartsBasedDetector_bin.dir/demo.cpp.o: In function `path<char*>':
/home/islab/workdir/library/boost/include/boost/filesystem/path.hpp:139: undefined reference to `boost::filesystem::path::codecvt()'
CMakeFiles/PartsBasedDetector_bin.dir/demo.cpp.o: In function `main':
/home/islab/workdir/workspace/PartsBasedDetector/src/demo.cpp:69: undefined reference to `boost::filesystem::path::extension() const'
collect2: ld returned 1 exit status
make[2]: *** [PartsBasedDetector/src/PartsBasedDetector] Error 1
make[1]: *** [PartsBasedDetector/src/CMakeFiles/PartsBasedDetector_bin.dir/all] Error 2
make: *** [all] Error 2

google後說是boost方面的問題,編譯時要再加上-lboost_system -lboost_filesystem指令
所以先拿boost的hello world程式來試一下這帖有沒有效:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main(){
       boost::asio::io_service io;
       boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
       t.wait();
       std::cout << "Hello, world!\n";
       return 0;
}
沒加上-lboost_system -lboost_filesystem指令也編不過,出現類似error
使用下列指令後,能成功編譯連結,執行後成功跑出"Hello, world!"
g++ test1.cpp -o test -L /home/islab/workdir/library/boost/lib/ -I /home/islab/workdir/library/boost/include/  -lboost_system -lboost_filesystem

接著要將指令加入Makefile中
修改~/workdir/workspace/build/PartsBasedDetector/src/CMakeFiles/PartsBasedDetector_bin.dir中的link.txt加入下列指令
-L /home/islab/workdir/library/boost/lib/ -I /home/islab/workdir/library/boost/include/  -lboost_system -lboost_filesystem

即可編譯連結成功!執行檔PartsBasedDetector存放路徑為~/workdir/workspace/build/PartsBasedDetector/src/

依照程式參數要求,指定model, input image的路徑後執行
Usage: PartsBasedDetector model_file image_file [depth_file]
可成功執行得到下列訊息,與demo.cpp裡預期結果不符:
Convolution time: 72.407629
Killed

20130110-gen-OpenCV-2.4.3 install on Ubuntu 10.0.4

posted Jan 9, 2013, 11:24 PM by 陳建儒

因為PartBaseDetector中使用的opencv函式為c++版,原本的opencv 版本為2.0.0不支援

所以安裝新版的

參考這篇http://blog.chinaunix.net/uid-25885064-id-3237941.html
1.首先在终端运行下列命令进行必要的编译环境安装。
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev cmake libswscale-dev libjasper-dev

2.下载OpenCV-2.4.1
# tar -jxvf OpenCV-2.4.1.tar.bz2
# cd OpenCV-2.4.1

3.终端运行  
# mkdir build 
# cd build
# cmake ../

4.依次运行 
# make
# make install

5.配置必要的库
# sudo gedit /etc/ld.so.conf.d/opencv.conf
添加/usr/local/lib这句到文件中,文件或许是空的,不影响。
# sudo ldconfig
# sudo gedit /etc/bash.bashrc
添加下面两行到文件的末尾并保存。
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

6.运行测试程序
# mkdir opencv_samples
# cp OpenCV-2.4.1/samples/c/* opencv_samples
# cd opencv_samples/
# chmod +x build_all.sh
# ./build_all.sh 
# ./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg

裝完成功執行人臉偵測程式,確認有成功安裝

20130107-gen-PartBasedDetector building

posted Jan 7, 2013, 3:30 AM by 陳建儒

modify:
新增FindEigen.cmake檔案在/home/islab/workspace
/home/islab/workspace/PartBasedDetector-master/src資料夾複製到/home/islab/workspace
修改在/home/islab/workspace的CMakeLists.txt如下:
7-11行:把功能關掉
option(BUILD_EXECUTABLE "Build as executable to test functionality"                     ON)
option(BUILD_DOC        "Build documentation with Doxygen"                              OFF)
option(WITH_OPENMP      "Build with OpenMP support for multithreading"                  OFF)
option(WITH_ECTO        "Build with ECTO bindings if building in a Catkin environment"  OFF)
option(WITH_ROS         "Build with ROS bindings if building in a Catkin environment"   OFF)
86-89行:加上使用函式庫之絕對路徑
set(BOOST_ROOT "/home/islab/workdir/library/boost")
set(OPENCV_ROOT "~/Desktop/OpenCV-2.0.0")
set(EIGEN_ROOT "/home/islab/workdir/library/eigen-3.1.2")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})


修改install PCL:
sudo aptitude install libpcl-all

install FLANN :
$cd flann-x.y.z-src
$ mkdir build
$ cd build
$ cmake ..
$ make

install HDF5 
$ sudo apt-get install libhdf5-serial-dev
$ sudo apt-get install libhdf5-mpich-dev

install ROS
$ sudo apt-get install ros-fuerte-pcl

install BOOST 
sudo apt-get install libboost-dev libboost-doc
http://www.blog.highub.com/linux/install-c-boost-on-ubuntu/
http://stackoverflow.com/questions/5759434/boost-installation

install VTK
 1.sudo apt-get install libvtk5.2(只能更新到5.2版,故不採用)
2.mkdir VTK_BUILD
    cd VTK_BUILD
    ccmake ../VTK
    sudo make -j 8 install
http://compgroups.net/comp.graphics.api.opengl/how-can-i-install-opengl-on-ubuntu/244967

install OpenGL

直接打下列指令出現error:
sudo apt-get install libgl1-mesa-dev
error:
Depends: libgl1-mesa-glx (= 7.7.1-1ubuntu2) but 7.7.1-1ubuntu3 is to be installed libglu1-mesa-dev
查網路說可能是第三方函式庫引起的問題,故先clean一下再安裝,試了後可成功安裝
sudo apt-get remove libgl1-mesa-glx && sudo apt-get update && sudo apt-get install libgl1-mesa-dev
http://bbs.csdn.net/topics/380097124



1-10 of 32