链接Linux中的动态共享库-对函数的未定义引用
Link dynamic shared library in Linux - Undefined reference to function
我知道有很多与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中使用。
你和你的咕咕不一致,也有咕咕到处跑,这需要保持一致,然后它工作(至少在我的电脑上现在有一些咕咕)
相关文章:
- 2个模板化类的非模板友元函数未定义引用错误
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 获取线函数未定义错误。无法在字符串中保存可验证的内容
- 链表复制构造函数 |未定义的行为
- 尝试使用 std::函数(未定义的符号)声明模板化类状态时出现链接错误
- 专用纯虚拟模板函数(未定义引用)的另一个问题
- 可视化C++ strtoull 函数未定义
- 绑定C++中的C函数(未定义的引用)
- 函数未定义引用c++
- C++构造函数未定义的引用
- 在同一语句中调用的执行 IO 的函数:未定义或未指定
- 在参数中接受 2 个类的友元函数 - 未定义'Class'
- c++ CreateWindow()函数未定义
- 使用c++中的haskell函数:未定义引用错误
- c++模板变量函数未定义引用
- OpenGL函数未定义glow
- C/ c++未使用的内联函数未定义的引用
- 调用从不兼容类型强制转换的零数据结构的成员函数-未定义
- Cocos2d-x Box2D CContactListener构造函数未定义
- 包括Boost网络库使Windows.h函数未定义