编辑: 我想我应该澄清,如果重要的话.我在AIX Unix机器上,所以我使用的是VAC编译器 - 没有gnu编译器. 结束编辑
我在C/C++中相当生疏,所以如果这是一个简单的问题,请原谅我.
我想从我的一些C程序中获取常用函数,并将它们放在共享库或共享对象中.如果我在perl中这样做,我会将我的sub放在perl模块中,并在需要时使用该模块.
为了举个例子,假设我有这个功能:
int giveInteger() { return 1034; }
显然这不是一个真实世界的例子,但如果我想分享这个功能,我将如何进行?
我很确定我有两个选择:
将我的共享函数放在一个文件中,并在编译时使用我的主程序进行编译.如果我对共享功能进行了更改,我将不得不重新编译我的主程序.
将我的共享函数放在一个文件中,并将其编译为共享库(如果我的条款正确),并将我的主程序链接到该共享库.我对共享库所做的任何更改(在编译之后)都会在运行时集成到我的主程序中,而无需重新编译我的主程序.
我对这个想法是否正确?
如果是这样,我怎样才能完成这两种方法中的任何一种/两种方法?我搜索了很多,我似乎找到了如何将自己的程序链接到其他人的共享库的信息,但不知道如何创建我自己的共享函数并以我可以在我自己的程序中使用它们的方式编译它们.
非常感谢!
布赖恩
编辑:
我编译我的共享函数:
xlc -c sharedFunctions.c -o sharedFunctions.o
然后使它成为共享对象:
xlc -qmkshrobj -qexpfile=exportlist sharedFunctions.o xlc -G -o libsharedFunctions.so sharedFunctions.o -bE:exportlist
然后链接另一个程序:
xlc -brtl -o mainProgram mainProgram.c -L. -lsharedFunctions
另一条评论帮助我找到了这个链接,这也有所帮助:http: //publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm
再次感谢所有帮助我的人!
是的,你是对的.第一个称为静态库,而第二个称为共享库,因为代码在编译时未绑定到可执行文件,但每次加载程序时都会再次绑定.
编译库的代码如下:
gcc -c *.c
该-c
通知程序无法连接到目标文件,但只是让你为每个目标文件.c
已编译的文件.现在,将它们归档到一个静态库中:
ar rcs libmystuff.a *.o
man ar
会告诉你rcs选项的意思.现在,libmystuff.a是一个物理学疗法文件包含这些目标文件(你可以用一些zip文件查看器打开它),为每个目标文件的符号索引一起.您可以将其链接到您的程序:
gcc *.c libmystuff.a -o myprogram
现在,您的程序准备就绪.请注意,静态库在命令中出现的顺序.请参阅我的链接订单答案.
对于共享库,您将使用创建库
gcc -shared -o libmystuff.so *.c
这一切都需要,libmystuff.so现在是一个S ^ hared Ø bject文件.如果要将程序链接到它,则必须将其放入文件中列出的/etc/ld.so.conf
目录中,或者由-L
切换到GCC的目录,或者列在LD_LIBRARY_PATH变量中.链接时,您从您告诉gcc的库名称中剪切lib
前缀和.so
后缀.
gcc -L. -lmystuff *.c -o myprogram
在内部,gcc只会将您的参数传递给GNU链接器.您可以使用-###
选项查看它传递的参数:Gcc将打印给每个子流程的确切参数.
有关链接过程的详细信息(如何在内部完成某些操作),请查看我的Linux GCC链接器答案.