我正在编译使用libcurl的代码,运行环境是Debian Linux系统。我的开发机器运行Debian 5,但我希望生成的二进制文件也能在旧的Debian 4系统上使用。
我发现如果我指定-lcurl,它会链接到libcurl.so.4,但是Debian 4系统仅有libcurl.so.3。
有没有办法告诉GCC链接到libcurl.so.3(在Debian 4和5中都存在)或者只链接到libcurl.so,以便使用任何可用的版本?
我正在编译使用libcurl的代码,运行环境是Debian Linux系统。我的开发机器运行Debian 5,但我希望生成的二进制文件也能在旧的Debian 4系统上使用。
我发现如果我指定-lcurl,它会链接到libcurl.so.4,但是Debian 4系统仅有libcurl.so.3。
有没有办法告诉GCC链接到libcurl.so.3(在Debian 4和5中都存在)或者只链接到libcurl.so,以便使用任何可用的版本?
使用-l:libcurl.so.3
替代-lcurl
当然还需要使用-L _installed_path_
-l:libfoo.so.1
来传递特定版本的共享库文件,而不是使用-lfoo
这种指定库名称的语法,遵循链接器命令行上的约定libfoo.so
。根据选项--library=namespec
在链接器文档部分可以看到,它应该能够满足你的需求。
为了更详细地说明如何通过示例链接到特定版本,请考虑一个包含两个版本相同的库的系统,即如果namespec的形式为:filename,ld将在库路径中搜索名为filename的文件
libfoo.so.1.0
和libfoo.so.2.0
,安装在其中一个库目录中,例如/lib
。$ ls -l /lib/libfoo*
lrwxrwxrwx root root /lib/libfoo.so -> /lib/libfoo.so.2
lrwxrwxrwx root root /lib/libfoo.so.1 -> /lib/libfoo.so.1.1
-rwxr-xr-x root root /lib/libfoo.so.1.0
-rwxr-xr-x root root /lib/libfoo.so.1.1
lrwxrwxrwx root root /lib/libfoo.so.2 -> /lib/libfoo.so.2.2
-rwxr-xr-x root root /lib/libfoo.so.2.0
-rwxr-xr-x root root /lib/libfoo.so.2.1
-rwxr-xr-x root root /lib/libfoo.so.2.2
# ldconfig -p | grep libfoo
libfoo.so.2 (libc6,x86-64) => /lib/libfoo.so.2
libfoo.so.1 (libc6,x86-64) => /lib/libfoo.so.1
libfoo.so (libc6,x86-64) => /lib/libfoo.so
-lfoo
编译的程序将使链接器寻找一个依赖于命名约定的文件,并解析为/lib/libfoo.so
(用于共享库对象)或/lib/libfoo.a
(用于静态库对象)。
与此相反,使用选项库使用一种特殊的文件名约定:一个名为foo的库应该存在于文件libfoo.so或libfoo.a中。
-l:libfoo.so.1
编译的程序将链接到/lib/libfoo.so.1
,它本身是一个指向libfoo.so.1.1
的符号链接,如上面的列表所示,这是从1.0进行的次要更新。-l:libfoo.so.2
编译的程序将与/lib/libfoo.so.2
进行链接,而该文件本身目前是指向libfoo.so.2.2
的符号链接,正如上面的列表所示,这是从2.0和2.1进行的次要更新。实际库foo的版本X.Y存在于文件libfoo.so.x.y中。在库文件内部,记录了一个名为libfoo.so.x的soname,以表示其兼容性。
$ ls -l /lib/libfoo.so.2*
lrwxrwxrwx root root /lib/libfoo.so.2 -> /lib/libfoo.so.2.3
[...]
-rwxr-xr-x root root /lib/libfoo.so.2.3
gcc -L. test.c -l:libavs.so.0.2.0
,但是 ldd 显示引用的是 libavs.so.0
。我能告诉它链接到确切的文件名吗? - Osman-pasha--filter
和--auxiliary
标志。这些标志并没有很好地记录,但应该允许您根据您所安装的机器从不同版本的同一库中加载符号。你可以在项目中创建一个符号链接,将其链接到 .3 版本,这样你就可以在编译时使用 -L 参数了。不过我不确定是否会有名称冲突,但你可以把它命名为 libcurl-old.so 以防万一。