我能够在linux libMySharedLibrary.so中创建一个共享库。
但是我在编译时包含一堆引用其他库的头文件。我想链接这些包含的头文件中的所有二进制代码,这样我就可以将我的共享库分发到一个.so文件中。
我正在使用gcc进行编译。在命令行下面:
gcc -I$JAVA_8_HOME/include/ -I$JAVA_8_HOME/include/linux/ -I./include/ -I. -fPIC -o libMyLibrary.so -shared com__MyLibrary.c
标头文件位于./include
内。我需要将生成的libMyLibrary.so与./include
中的头文件的二进制文件链接起来。
如何?
答案 0 :(得分:1)
我想链接这些包含的头文件中的所有二进制代码,以便将共享库分发到一个.so文件中。
你不能做你想做的事情(这违背了共享库的整个想法,正如他们的名字暗示的那样,共享 > processes之间virtual address space和dynamic linker之间的多个How To Write Shared Libraries和“已加载”。
您应该阅读Drepper的Program Library HowTo论文和ld-linux(8)。另见elf(5)& objdump(1)& readelf(1)& ld(1)& ldd(1)& Invoking GCC。阅读.deb
。
为了简化软件的发布,您可能需要构建一些目标为package manager的软件包(例如free software个)。您可以将源代码发布为github(例如,在position-independent code上)。
您可以(也许应该)将其他较低级别的共享库与您自己的共享库链接起来。但是您的用户仍然需要安装这些库。例如,您可以使用
进行编译 gcc -Wall -O -g -I$JAVA_8_HOME/include/ -I$JAVA_8_HOME/include/linux/ \
-I./include/ -I. -fPIC -o libMyLibrary.so \
-shared com__MyLibrary.c -lother
并与ldd libMyLibrary.so
核对,这取决于某些libother.so.*
(您的用户应安装使用libMyLibrary.so
)。
您可以将您正在使用的所有代码(如linker) - 包括“其他库”的源代码 - 编译到单个共享库中,但不建议这样做(如果你这样做,程序实际上可能不会在上面的几个共享库中使用某些共享的低级函数。)
您还需要了解库不一组头文件,即了解preprocessor和API的角色。头文件只描述(部分)某些C或C ++库的Linkers and Loaders。另请阅读Levine的inline functions书。在实践中,头文件声明一些东西(类,函数,变量,类型......),并且可能定义 translation units(但不是全局的)。您需要了解proc(5)是什么。
您可以在/proc/
文件系统(请参阅ALP)的帮助下,了解某个给定进程的虚拟地址空间。例如,在终端中尝试cat /proc/$$/maps
。
您可能会阅读一些Linux编程书籍,可能是旧版Operating Systems: Three Easy Pieces(可免费下载)或更新版本。您可以阅读一些有关操作系统的教科书,例如source code(也可免费下载)。
还要了解现有 free software库的github和构建过程的灵感(例如,来自您的Linux发行版,或build automation或其他地方)。您应该考虑使用一些GNU make工具(例如ninja或{{3}})来构建自己的库。