在Linux中如何链接和编译.so文件

4

我有一个.c和.so文件。我尝试使用以下编译命令:gcc main.c -ldl。在那个.c文件中,我通过dlsym()链接到.so文件。如何使用.so文件编译.c文件。

3个回答

5
也许你可以这样做:
在链接时执行以下操作:
g++ -o prog prog.o -ldllname

如果libdllname.so不在系统目录中,则将其所在的目录添加到库路径中:
g++ -o prog prog.o -L/path/to/my/library/folder -ldllname

2

这是基于您进一步的评论。首先保护您头文件的声明。

#ifndef HEADER_PROTECT
#define HEADER_PROTECT

---------- Here is the content of header

#endif

接下来,请检查您的代码,是否定义了多个定义。或者您是否再次重新定义标准函数?您能否请发布您的代码以便更好地指导您?
看起来您已经重新定义了Close_Comm(),您能否检查一下?错误提示说在main.c中也有该定义。
以下是编译共享对象并链接的一般方法。 编译共享对象的命令如下:
-g : for debug information
fPIC: for position independent code
$gcc -fPIC -g myfile

The following will create the shared  object libmyfile.so

$gcc -shared -o libymyfile.so myfile.o

Now,In order to link it with your main.c.
I assume that the libmyfile.so is in your current path, thus -L./

$gcc main.c -o main.out -L./ -lmyfile

Now, you need to export the LD_LIBRARY_PATH on the bash; in order to execute the binary.

$LD_LIBRARAY_PATH=$LD_LIBRARAY_PATH:./
$./main.out

dlsym 是在运行时从共享对象中加载符号的函数。如果您想在运行时加载共享对象,可以使用它。以下是 dlsym 的一个示例 破解库中的标准函数并在之后调用本地库函数


如果您仍然遇到错误,请粘贴完整的错误信息。我将能够告诉您确切的问题所在。对我来说,这似乎是一个路径问题。因为您无法链接.so文件。 - dexterous
我的文件名是main.c和crt.so,我按照您上面的指示尝试了$gcc main.c -main.o -L./ -lcrt。但我得到了以下错误:main.o:在函数“Close_Comm”中: main.c:(.text+0x0):对“Close_Comm”的多重定义 /tmp/ccQt5qnj.o:main.c:(.text+0x12f):此处首次定义 crt.o:(.bss+0x0):对“NotOpen”的多重定义 /tmp/ccQt5qnj.o:(.bss+0x0):此处首次定义 crt.o:在函数“menu”中: crt.c:(.text+0x77):对“menu”的多重定义 /tmp/ccQt5qnj.o:crt284utest.c:(.text+0x171e):此处首次定义 crt.o:在函数“Open_Comm”中: - Brainy
我认为你应该先查看这个链接:http://www.tune2wizard.com/c-how-main-is-executed/。它还涵盖了 crt 部分的内容。简而言之,你的 main 函数会链接到 crt1.s 文件。不需要链接 crt。只需执行 $gcc main.c -o main.out 即可。此外,你能分享一下你创建的库和 main.c 的源代码吗? - dexterous
不,这实际上是几个函数的多重定义 - 在main.c和.so文件中都有。代码是错误的,与gcc或其他任何东西无关。 - keltar
@keltar:是的,我同意代码有问题。标题说“如何在Linux中链接和编译.so文件”?这是一个泛泛而谈的问题。但后来他描述了他的问题。当然,他对这些函数Close_Comm等有多个定义,例如在main.c中。如果他能分享代码,我们可以更好地帮助他。 - dexterous
显示剩余2条评论

0

dlsym() 用于在打开的库文件中查找符号。你需要先使用 dlopen() 打开文件,然后再使用 dlsym()


我的文件名是main.c和crt.so,我按照您上面的指示尝试了$gcc main.c -main.o -L./ -lcrt。但我得到了以下错误:main.o:在函数Close_Comm'中:main.c:(.text+0x0):多次定义Close_Comm'/tmp/ccQt5qnj.o:main.c:(.text+0x12f):此处首次定义crt.o:(.bss+0x0):多次定义NotOpen'/tmp/ccQt5qnj.o:(.bss+0x0):此处首次定义crt.o:在函数menu'中:crt.c:(.text+0x77):多次定义menu'/tmp/ccQt5qnj.o:crt284utest.c:(.text+0x171e):此处首次定义crt.o:在函数Open_Comm'中: - Brainy

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