将C库与非标准名称链接

Esc*_*alo 7 c linker gcc

我正在使用gcc编译一个程序,我需要链接到一个非标准名称的C库; 它被称为stuff.a而不是libstuff.a.

我无法更改文件的名称(权限问题).

我不想包含完整的库(即使用gcc program.c stuff.a -oprogram)

我想编译为gcc program.c -L/path/to/library/ -lstuff -oprogram但是gcc不会找到库(因为它没有被调用libstuff.a).

我正在开发一个Linux机器.

如何完成(动态)链接?

编辑:

谢谢大家,我为一个措辞不好的问题道歉.

我甚至没有共享对象(我以为我可以动态链接到*.a文件),所以这让很多人困惑.再一次,为我的无知道歉.

我最终做的是在本地目录中创建共享对象,将该位置附加到我的LD_LIBRARY_PATH环境变量,然后再次链接.

它就像一个魅力(从1.3M可执行到5.8K).

再次感谢.

Chr*_*oph 8

你应该看一下gcc手册:

使用-l选项和指定文件名之间的唯一区别是使用-l'lib'和'.a'包围库并搜索多个目录.

使用stuff.aas参数没什么不对.


jsc*_*ier 7

假设不存在静态库的共享对象版本,则可能需要创建一个.请记住,静态库stuff.a只是一个ar存档.

ar -x stuff.a
gcc -shared *.o -o libstuff.so
Run Code Online (Sandbox Code Playgroud)

这假设您希望将其作为共享库链接,而不是简单地将其编译为二进制文件.

  • 有意思,但.o文件必须已被编译为与位置无关的代码才能使其正常工作,如果它们用于静态库,它们可能就不存在了,对吧? (6认同)
  • +1 表示高级水晶球使用或读心能力;) (2认同)

mta*_*xan 6

我知道问题出在尝试将静态库设置为动态链接的问题,但为了后代,我想添加这一点:

如果您在选项的参数前面-l加上冒号 ,:它将将该名称视为文字,而不是需要在前面添加“lib”并将文件扩展名添加到末尾的名称。

如果您描述要链接到 astatic.a而不是 a 的位置libstatic.a,并且假设您确实打算静态链接到它,则以下内容将起作用:

 gcc program.c -L/path/to/library/ -l:stuff.a -oprogram
Run Code Online (Sandbox Code Playgroud)

您当然可以像 Richard Penington 和 Anycorn 都提到的那样,只需在命令行上包含全路径库即可:

gcc program.c /path/to/library/stuff.a -oprogram
Run Code Online (Sandbox Code Playgroud)