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