gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:48 28 4
gpt4 key购买 nike

我知道有很多与 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com