链接Linux中的动态共享库-对函数的未定义引用

Link dynamic shared library in Linux - Undefined reference to function

本文关键字:函数 未定义 引用 共享 Linux 动态 链接      更新时间:2023-10-16

我知道有很多与Linux上的共享库相关的问题,但可能是因为我厌倦了在Linux上辛苦地创建一个简单的动态库(在Windows上只需要不到10分钟),我找不到在这种情况下会发生什么。所以,我试图创建一个库链接在构建时,并在运行时使用(不是一个静态库,不是一个库嵌入到可执行文件,换句话说)。现在它包含一个简单的函数。这些是我的文件:

1。

// gugulibrary.cpp
// This is where my function is doing its job
#include "gugulibrary.h"
namespace GuGu {
    void SayHello() {
        puts("Hello!");
    }
}

2。

// gugulibrary.h
// This is where I declare my shared functions
#include <stdio.h>
namespace Gugu {
    void SayHello();
}

3。

// guguapp.cpp
// This is the executable using the library
#include "gugulibrary.h"
int main() {
    GuGu::SayHello();
    return 0;
}

这是我如何尝试建立我的项目(我认为这是什么是错误的):

gcc -Wall -s -O2 -fPIC -c gugulibrary.cpp -o gugulibrary.o
ld -shared -o bin/libGugu.so gugulibrary.o
gcc -Wall -s -O2 guguapp.cpp -o bin/GuGu -ldl
export LD_LIBRARY_PATH=bin

这被保存为.sh文件,我单击它并在终端中执行。当我试图链接库时,我得到的错误是:

/tmp/ccG05CQD.o: In function `main':
guguapp.cpp:(.text.startup+0x7): undefined reference to `SayHello'
collect2: ld returned 1 exit status

这就是我迷路的地方。我希望库现在坐在同一个文件夹作为可执行文件,也许我需要一些符号/定义文件或其他东西,我不知道如何创建。谢谢你的帮助!

在你的c++文件中,GuGu::SayHello被声明为一个c++符号。在标题中,您将其包装在extern "C"块中。这实际上是未定义的,因为您不允许在该上下文中使用c++语法(namespace)。但我的猜测是编译器正在做的是忽略命名空间并生成一个C符号名称"SayHello"。显然,您的库从未定义过这样的函数。取出extern "C"位,因为定义的API无论如何都不能从C中使用。

你和你的咕咕不一致,也有咕咕到处跑,这需要保持一致,然后它工作(至少在我的电脑上现在有一些咕咕)