if (!handle)
{
fprintf (stderr, "%s\n", dlerror());
exit(1);
}
dlerror();
ptr是指向内存块地址,new_size是吧ptr指向的内存块重新划分大小。
首先,分配动态的空间,指针p和空间的首地址是没有直接的联系的,只是为了手续要使用这个刚刚分配的空间才让p指针指向这个刚刚分配的空间的首地址的话,如果还不理解,你可以反向想想如果你分配的这个空间,而不用p指针指向这个首地址,那么你如何使用这个空间呢。
lpossiblylost:存在指针指向内存中的某个位置,valgrind认为你有可能是在做一些其他的高级应用(将指针放在申请的内存块中间)。
l possiblylost:存在指针指向内存中的某个位置,valgrind认为你有可能是在做一些其他的高级应用(将指针放在申请的内存块中间)。
if ((error = dlerror()) != NULL)
{
fprintf (stderr, "%s\n", error);
exit(1);
}
pf();//通过指针pf的调用来调用动态库中的test函数
dlclose(handle);//关闭调用动态库句柄
return 0;
}
makefile的基本结构不是很复杂,但当一个程序开发人员开始写makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的makefile 经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,makefile可能还要跟着修改。
在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的makefile,这有利于让我们的makefile变得更加地简洁,而不至于把所有的东西全部写在一个makefile中,这样会很难维护我们的makefile,这个技术对于我们模块编译和分段编译有着非常大的好处。
我们把这个makefile叫做“总控makefile”,总控makefile的变量可以传递到下级的makefile中(如果你显示的声明),但是不会覆盖下层的makefile中所定义的变量,除非指定了“-e”参数。
很多时候,我们在网上下载的linux开源软件都会遇到一个问题,就是源码里面没有直接的makefile,但是它有makefile.am和makefile.in或者它有makefile.am和configure.in,这里就不详细解释他们直接的关联,直接给出如何操作生成makefile。
.SUFFIXES: .c .cpp .o
CC=g++ -shared -fPIC
GCC=g++
all:test_so1.so test_so2.so test_dl clean
OBJ1=test_so1.o
OBJ2=test_so2.o
OBJ3=test_dl.o
test_so1.so:$(OBJ1)
$(CC) -o $@ $?
cp $@ /usr/lib
test_so2.so:$(OBJ2)
$(CC) -o $@ $?
cp $@ /usr/lib
test_dl:$(OBJ3)
$(GCC) -o $@ $? -ldl
.cpp.o:
$(CC) -c $*.cpp
.c.o:
$(CC) -c $*.c
clean:
rm -f *.o
上述源程序中,需重点注意两个问题:
1、test_dl.cpp中,对于动态库中的test函数调用是通过函数指针来完成的。
2、test_so1.h和test_so2.h中都使用了extern "C"。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-90978-5.html
好有道理
拉森号可不能说是老旧军舰
舰多不算本事