我正在使用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).
再次感谢.
假设不存在静态库的共享对象版本,则可能需要创建一个.请记住,静态库stuff.a只是一个ar存档.
ar -x stuff.a
gcc -shared *.o -o libstuff.so
Run Code Online (Sandbox Code Playgroud)
这假设您希望将其作为共享库链接,而不是简单地将其编译为二进制文件.
我知道问题出在尝试将静态库设置为动态链接的问题,但为了后代,我想添加这一点:
如果您在选项的参数前面-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)