Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux中的链接动态共享库-函数的未定义引用_C++_Linux_Reference_Export_Dynamic Library - Fatal编程技术网

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

C++ Linux中的链接动态共享库-函数的未定义引用,c++,linux,reference,export,dynamic-library,C++,Linux,Reference,Export,Dynamic Library,我知道在Linux上有很多与共享库相关的问题,但可能是因为我厌倦了在Linux上辛苦地创建一个简单的动态库(在Windows上只需不到10分钟),我找不到在这种情况下会发生什么。 因此,我试图创建一个在构建时链接并在运行时使用的库(换句话说,不是静态库,也不是嵌入到可执行文件中的库)。目前,它包含一个简单的函数。这些是我的文件: 一, 二, 这就是我试图构建我的项目的方式(我认为这是错误的): 这保存为一个.sh文件,我在终端中单击并执行该文件。尝试链接库时出现的错误如下: /tmp/ccG05

我知道在Linux上有很多与共享库相关的问题,但可能是因为我厌倦了在Linux上辛苦地创建一个简单的动态库(在Windows上只需不到10分钟),我找不到在这种情况下会发生什么。 因此,我试图创建一个在构建时链接并在运行时使用的库(换句话说,不是静态库,也不是嵌入到可执行文件中的库)。目前,它包含一个简单的函数。这些是我的文件:

一,

二,

这就是我试图构建我的项目的方式(我认为这是错误的):

这保存为一个.sh文件,我在终端中单击并执行该文件。尝试链接库时出现的错误如下:

/tmp/ccG05CQD.o: In function `main':
guguapp.cpp:(.text.startup+0x7): undefined reference to `SayHello'
collect2: ld returned 1 exit status
这就是我迷路的地方。现在我想让库和可执行文件放在同一个文件夹中,也许我需要一些符号/定义文件或其他我不知道如何创建的东西。
谢谢你的帮助

> P> >你与古古不一致,也有顾谷的四处奔跑,这需要一致,然后它在我的电脑中工作(至少在我的电脑上有一些古古)

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

看起来您缺少
-lGugu
为什么
gcc
?为什么不
g++
?好吧,但我认为这不能解决问题。无论如何,谢谢你!另外,(对我来说)还不清楚,当使用非C结构(如
名称空间
)时,
extern C
有什么意义……而且,对于courese,您需要添加libGugu.so:
g++-Wall-s-O2 guguapp.cpp bin/libgugugu.so-o gugugu-ldl
您的意思是我不能为可执行文件创建.so文件,把它放在同一个目录中,瞧?不,你也可以这样做:
gcc-Wall-s-O2-fPIC-c gugugulibrary.cpp-o gugugulibrary.o
ld-shared-o bin/libgugugu.so gugugugulibrary.o
gcc-Wall-s-O2 guguapp.cpp-Lbin-lGugu-o gugugugugu-ldl
请注意,你必须省略
。所以
扩展才能使它工作,差不多了。现在,当使用库(./GuGu)执行应用程序时,我得到了一个符号查找错误。使用unconsistent,我的意思是您有时用GuGu大写来写(写)第二个G,有时不用谢。这修复了一些问题,但仍然存在一个问题:加载共享库时出错:bin/libGuGu.so:无法打开共享对象文件:没有这样的文件或目录包含libguu.so的目录应该显示在您的LD_LIBRARY_路径上
// gugulibrary.h
// This is where I declare my shared functions
#include <stdio.h>

namespace Gugu {
    void SayHello();
}
// 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
/tmp/ccG05CQD.o: In function `main':
guguapp.cpp:(.text.startup+0x7): undefined reference to `SayHello'
collect2: ld returned 1 exit status