将C库与非标准名称链接

时间:2010-01-21 19:07:20

标签: c gcc linker

我正在使用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)。

再次感谢。

6 个答案:

答案 0 :(得分:8)

你应该看看gcc manual

  

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

使用stuff.a作为参数没有任何问题。

答案 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