在每个C++程序(或库、目标文件)中,所有非静态(non-static)函数在二进制文件中都是以“符号(symbol)”形式出现的。这些符号都是唯一的字符串,从而把各个函数在程序、库、目标文件中区分开来。
其次,lib的文件要分的细一点,没有调用关系的两个函数不要放到同一个c文件中,因为lib51在链接的时候是按模块来链接的,一个模块就对应一个c文件,假如链接器因为要使用你一个函数fa而引入了a模块,那么a模块中的另外的函数也会被引入,而另外的函数你又没有使用的话,那么就会引发keil经典的uncalled func的warning。
最重要的参数两个:lpstartaddress,输入函数的名称,只能是全局函数或静态函数。
答 : 委托是指具有相同函数签名(返回类型相同,参数类型、参数顺序及参数个数相同)的函数或方法的抽象,关键字为delegate。
当用:: 使用方法是被认为该方法为静态方法, 静态方法中不允许使用$this, 因为静态方法的调用不需要实例化, 而$this是实例化後才出现的, 所以静态方法类似于一个普通的函数。
正如上面的例子,当我们打开优化选项并重新编译时,我们会看到:$ gcc-std=c99 foo.c -o2 -o foo$./foo$ inline foo in foo.c在-o2的优化选项下,编译器进行了内联优化,并采用了foo的inline定义。
$(space)使用了$(empty)定义了一个空格,$(foo)的值是“a b c”,$(bar)的定义用,调用了函数“subst”,这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个 参数是替换操作作用的字串。
简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
$(space)使用了$(empty)定义了一个空格,$(foo)的值是“a b c”,$(bar)的定义用,调用了函数“subst”,这是一个替换函数,这个函数有三个参数,第一个参数是被替换字符串,第二个参数是替换字符串,第三个参数是替换操作作用的字符串。
其中一个问题是,C++标准(目前是[ISO14882])并没有定义名字必须如何被mangle,所以每个编译器都按自己的方式来进行namemangling。有些编译器甚至在不同版本间更换mangling算法(尤其是g++2.x和3.x)。即使您搞清楚了您的编译器到底怎么进行mangling的,从而可以用dlsym调用函数了,但可能仅仅限于您手头的这个编译器而已,而无法在下一版编译器下工作。
用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。因此,只有非成员函数才能被声明为extern"C",并且不能被重载。尽管限制多多,extern"C"函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。冠以extern"C"限定符后,并不意味着函数中无法使用C++代码了,相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。所以extern"C" 只是告诉编译器编和链接的时候都用c的方式的函数名字,函数里的内容可以为c的代码也可以为c++的。
执行makefile正常编译后,可生成test_so1.so、test_so2.so动态库以及test_dl执行程序。可执行test_dl,显示结果如下:
[root@localhost so_src]# ./test_dl test_so1.so
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-90978-6.html
怎么感觉luna高了呢@ZHAYITING