1

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

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

4

2 回答 2

2

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

于 2013-01-03T21:40:39.470 回答
1

你和你的咕咕不一致,也有咕咕跑来跑去的,这个需要统一,然后就可以了(至少我的电脑上现在有一些咕咕的)

于 2013-01-03T21:30:16.210 回答