我正在使用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)。
再次感谢。
答案 0 :(得分:8)
答案 1 :(得分:7)
假设不存在静态库的共享对象版本,则可能需要创建一个。请记住,静态库stuff.a只是一个ar存档。
ar -x stuff.a
gcc -shared *.o -o libstuff.so
这假设您想要将其作为共享库链接,而不是简单地将其编译为二进制文件。
答案 2 :(得分:4)
您可以创建一个名为stuff.a
的{{1}}的符号链接吗?您甚至可以在另一个目录中创建符号链接(即,不是标准库目录),并使用libstuff.a
选项和-L
来包含带符号链接的目录。
答案 3 :(得分:3)
像对象文件一样链接它:
gcc blah.o /usr/local/lib/foo.a -o binary
如果您不喜欢完整路径,只需使用变量即可。否则你可以解析LD_Library_Path和测试文件是否存在
答案 4 :(得分:1)
只需输入全名:
gcc program.c /path/to/library/stuff.a -oprogram
答案 5 :(得分:1)
我知道问题原来是试图将静态库设置为动态链接,但我想为后人添加这个:
如果您使用冒号-l
为:
选项添加参数,它会将名称视为文字,而不是需要" lib"添加到前面,文件扩展名添加到结尾。
如果您描述了要与static.a
而不是libstatic.a
进行关联的位置,并假设您打算静态链接它,则以下内容将起作用:
gcc program.c -L/path/to/library/ -l:stuff.a -oprogram
你当然可以像Richard Penington和Anycorn那样提到并简单地在命令行中包含完整的图书库:
gcc program.c /path/to/library/stuff.a -oprogram