我们需要将闭源C库集成到我们的项目中。另一方可以在我们需要的任何模式下编译库,但我们支持许多不同的Windows和Linux编译器。
我知道DLL将与所有主要的Windows编译器兼容,因此我们只能为Windows使用一个库。但我不熟悉Linux动态库(.so)。它们是否以类似的方式在所有Linux环境中兼容?
由于
答案 0 :(得分:2)
你可能有些问题w.r.t. GNU libc的版本,该共享库libotherparty.so
已链接(并编译)。
您当然需要知道libc的版本,并且您可能要求该方提供二进制库的多个变体。
我强烈建议阅读Drepper的论文:How To Write Shared Libraries。另请参阅this question和Levine的linker & loader一书。
如果是C代码,编译器并不重要。更重要的是ABI。另请参阅symbol versioning。
准备好遇到麻烦。
您将从经验中了解到自由软件更为可取。
答案 1 :(得分:1)
如果希望更改函数接口(C ++公共/受保护类定义),则应为共享对象指定库版本,库中包含更多或更少的函数,函数原型更改(返回数据类型(int,const) int,...)或参数列表更改)或数据类型更改(对象定义:类数据成员,继承,虚函数,...)。
创建共享对象库时,可以指定库版本。如果希望更新库,则应指定库版本。这对于动态链接的共享对象库尤其重要。这也避免了Microsoft" DLL地狱"更改标准库的系统升级会破坏较旧版本的共享对象函数的旧应用程序的库冲突问题。
版本控制也发生在GNU C / C ++库中。这通常会使用一个版本的GNU工具编译的二进制文件与使用其他版本编译的二进制文件不兼容,除非这些版本也驻留在系统上。由于版本控制,同一个库的多个版本可以驻留在同一系统上。该库的版本包含在符号名称中,因此链接器知道要链接的版本。
可以查看使用的符号版本:nm csub1.o
00000000 T ctest1
默认情况下,目标代码中未指定版本。
有一个GNU C / C ++编译器标志明确处理符号版本控制。使用以下标志指定要在编译时使用的版本脚本: - version-script = your-version-script-file
注意:这仅在创建共享库时有用。假设程序员在静态链接时知道要链接哪些库。运行时链接允许库不兼容的机会。
另请参阅here关于ABI兼容性