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

标签 c++ linux reference export dynamic-library

我知道有很多与 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++ 符号。在您的 header 中,您将其包装在 extern "C" block 中。这实际上是未定义的,因为不允许在该上下文中使用 C++ 语法 (namespace)。但我的猜测是编译器正在做的是忽略命名空间并生成一个名为“SayHello”的 C 符号名称。显然,您的图书馆从未定义过这样的功能。取出 extern "C" 位,因为您定义的 API 无论如何都不能从 C 中使用。

关于c++ - 在 Linux 中链接动态共享库 - 未定义的函数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147376/

相关文章:

c++ - 如何在C++中使用popen打开 "screen"?

PHP 对静态变量的引用

reference - 如何在 Visual Studio 2013 中访问 NuGet 包管理器?

c++ - 如何检查数组中的值

c++ - 为什么我们不能在内存限制内声明一个任意大小的数组,比如 int 数据类型?

linux - Nginx 重写规则而不改变 url

c++ - 反向字符串脚本给出运行时错误

c++ - 为 C++ ostream 自定义流缓冲区

c++ - 为什么我的单个字符不止一个字符长?

python - 无法打开 40 针接头上的 UART