使用gcc链接共享库

50
我有一个使用Real View Compiler Tools (RVCT 3.2)在Windows目标上创建的共享库(*.so)。然后,我尝试在Linux系统上使用gcc将这个*.so文件与我的应用程序链接起来。
那么,在Linux上,链接这个共享库到我的应用程序需要使用什么gcc选项呢?
我的问题是,是否使用-shared选项,如下所示:
gcc -shared myfile.so

...,是用来创建SO文件还是链接SO文件?我相信它会创建类似以下的东西:

gcc -lmyfile.so

这个足够了吗?或者还有其他的开关告诉链接器它是一个动态库(共享对象)吗?

2个回答

64

对我有效的是:

gcc -L. -l:myfile.so

10
如果我有一个名为libmine.so的库文件在/home/newhall/lib/中,那么我可以按照以下方式将其链接到我的程序中: $gcc -o myprog myprog.c -L/home/newhall/lib -lmine 【参考网站】https://www.cs.swarthmore.edu/~newhall/unixhelp/howto_C_libraries.html - Gowrav
22
对于那些想知道冒号的作用的人来说,它使链接器查找具有精确指定名称的文件,而不是查找名称变体。请参见https://dev59.com/YlYM5IYBdhLWcg3wrBjT#48540643。 - Harry Cutts
1
连接时,动态库(.so)和静态库(.a)有区别吗?我一直认为动态库只在运行时使用,而不是编译时使用。我错过了什么吗? - Bemipefe
这里显示“未定义的引用”,但是在文件中已经定义了。为什么? - circl
/usr/bin/ld: 找不到-l:/ - CS QGB

28

gcc -lmyfile应该足够了(前提是你的库名为libmyfile.so)。链接器会尽可能地搜索共享对象并据我所知更喜欢它们。


我有一个相关的问题:如果我的库libmyfile.so是指向libyourfile.so的符号链接,那么使用gcc -lmyfile链接我的程序仍然有效吗?(我需要维护某些客户端的向后兼容性,这些客户端不知道库名称的更改。) - baskin
3
如果文件名的扩展名是.dll,它能正常工作吗? - mrk
1
如果库不在/usr/bin/ld中怎么办? - Dragos Rizescu
3
请添加选项“-L /path/to/so/folder/”,以添加搜索“.so”文件的文件夹。 - Diederik
我尝试在Eclipse CDT中链接libraryName.dll,但是当我指定完整文件名时它无法链接 - 只有在指定没有扩展名的文件名时才能正常工作:libraryName。因此,链接器选项为-llibraryName - Danijel
如果我们有两个不同版本的myfile库,想要只附加其中一个,该怎么做呢? - ABD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接