半冷半暖秋天

2010-11-26

ubuntu系统在apt-get时缺少公钥的解决办法

Filed under: linux相关 — 标签:, , — sunu @ 19:14:54

新加入更新源/etc/apt/source.list后,执行apt-get update更新贪睡,发现检查更新提示:

W: GPG 错误:http://ppa.launchpad.net maverick Release: 由于没有公钥,
无法验证下列签名: NO_PUBKEY 062609DAF2670104 (红色部分是下面命令需要使用的)

可执行如下命令解决:

[~]#gpg --keyserver subkeys.pgp.net --recv F2670104
[~]#gpg --export --armor F2670104 |  apt-key add -

参考:http://hi.baidu.com/barryxkl/blog/item/caa3493f3244f03771cf6c68.html

2010-10-27

linux下dlopen动态导入so库中的C++对象

Filed under: C/C++,linux相关 — 标签:, , , , — sunu @ 13:40:49

 Linux下的dlopen、dlsym、dlclose 相当于windows平台的LoadLibrary、GetProcAddress 、FreeLibrary,可以在运行时动态加载动态库,使用其中的导出函数。但是局限在于,这样仅仅能够导出全局函数,而不能导出类的方法。所以一般动态库导出C++类实现的功能时都会设计一大堆的全局函数来包装一下。比如(伪代码)

class A{
public:
      int run(...){...};
}

导出函数及使用可能会是:


//导出函数
handle_type AOpen(parameters...);
int ARun(handle_type handle, parameters...);
void AClose(handle_type handle);

//使用时可能是:
handle_type AHandle = -1;
AHandle = AOpen(....);     //获取句柄,即在AOpen中实例化一个A对象
ARun(AHandle, ....);        //句柄亦做为参数,即通过句柄在内部找到由AOpen生成的实例
AClose(AHandle);            //通过句柄释放先前生成的对象

//内部原理:动态库内部维护一张表(句柄与A类一一对应),
//             每次AOpen都生成新A对象和新AHandle,放入
//             内部表, 以后调用此A对象的方法时,都需要通过
//             句柄先在内部映射表中找到对象。

这多少有些郁闷吧,要是能直接像动态连接一样使用类多好。比如一拿到A.so直接new A()就能用。可是这是不行的,dlopen仅能导入函数,并且是c风格的名字类型。

C++ dlopen mini HOWTO里给了一种折中方案,就是通过导出“创建类的函createA数”和“释放类的函数releaseA”来使用动态库中的类,这和模式设计中的工厂模式是一样的。

具体的做法是:
1. 准备一份头文件,加入一个纯虚父类ABase,并声明createA,releaseA;
2. 在生成A.so的实现源码中,写业务类AHello,继承ABase,并导出上面提到的两个函数createA,releaseA;
3. 需要使用A.so的代码,使用dlopen打开so文件,dlsym导入createA,releaseA, 调用createA返回ABase指针类型的实际是AHello类型的实例,便可以使用这个AHello类实例了;
4. 调用raleaseA释放AHello实例。

注意:
1. 基类是必须是,不然编译器怎么在编译的时候知道AHello的实现在哪里?
2. 函数导入出需要加上extern “C”防止导出名字被修改。

如此一来,使用某个导出类的动态库*.so,只要拿到它的父类声明就可以dlopen动态导入了,可以实现下面形式的调用。

int main()
{
    void *dl  = load_so("./a.so");
    test_so(dl);

    dl  = load_so("./b.so");
    test_so(dl);

    dl  = load_so("./c.so");
    test_so(dl);
    return 0;
}

示例代码:exportclass

参考:
 1. http://www.faqs.org/docs/Linux-mini/C++-dlopen.html
 2. http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx (未细读,可能不相关)

linux下找出usb网卡的驱动

Filed under: linux相关,文档及资源 — 标签:, , , — sunu @ 13:14:28

ubuntu 10.10对TP-LINK TL-WN721N的支持很好,一插上就找到网络了。同事说想看看对应的驱动源码,问我知不知道怎么找出是加载了哪个驱动。

lsmod 可以列出以模块方式加载的内核模块,如果编译内核的时候选择了Y(内嵌方式)则看不到的。
lsusb 可以列出当前计算机上已连接的USB设备的信息,像产家编号,型号编号什么的。
/lib/modules/2.6.***/modules.alias 文件包含了硬件编号与模块名的对应关系,即系统根据编号(我们在lsusb中看到的)来确定加载正确的模块。

比如TP-LINK TL-WN721N相应的编码是CF03 9721,在modules.alias中可以找到相似的字符串,其后即是驱动名ath9k_htc。
如果不相信这就是驱动,可以通过rmmod ath9k_htc卸载看看网卡还能不能用。

2010-10-16

slickEdit for linux(15.0.1.3) – 非常棒的IDE

Filed under: linux相关,文档及资源 — 标签:, , , — sunu @ 09:39:58

SlickEdit是一个功能强大的编辑器,具有先进的代码浏览,导航,代码自动完成等特性,具备与Microsoft Visual Studio相似的界面布局。个人感觉比anjuta/codeblock等IDE要好用一些,毕竟是商业软件。SlickEdit原生支持Windows/Linux/Mac等好几个平台(非java或wine)。
slickedit

完整试用版: http://www.slickedit.com/trial/slickedit,破解文件:http://download.csdn.net/source/2414276,试过确实可用。

2010-10-15

sis 显卡驱动(ubuntu10.10)

Filed under: linux相关 — 标签:, , — sunu @ 11:53:37

我的显卡是:VGA compatible controller: Silicon Integrated Systems [SiS] 771/671 PCIE VGA Display Adapter (rev 10)
ubuntu 10.10 默认的驱动无法使用1280×800的最佳分辨率,安装以下文件后重启即可。
sis_vga_drivertar

Powered by WordPress