首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于Linux的C++动态共享库

基于Linux的C++动态共享库
EN

Stack Overflow用户
提问于 2009-01-30 18:41:56
回答 2查看 254.3K关注 0票数 184

这是Dynamic Shared Library compilation with g++的后续版本。

我正在尝试用Linux上的C++创建一个共享类库。我能够编译这个库,并且可以使用我找到的herehere教程调用一些(非类)函数。当我尝试使用库中定义的类时,我的问题就开始了。我链接到的第二个教程展示了如何加载符号来创建库中定义的类的对象,但没有使用这些对象来完成任何工作。

有没有人知道关于创建共享C++类库的更完整的教程,它还展示了如何在单独的可执行文件中使用这些类?一个非常简单的教程,展示了对象的创建、使用(简单的getter和setter就可以了),还有删除就很棒了。说明共享类库的用法的一些开放源代码的链接或引用也同样好。

虽然来自codelogicnimrodm的答案确实有效,但我只想补充一句,在提出这个问题后,我拿起了一份Beginning Linux Programming,它的第一章有示例C代码和创建和使用静态和共享库的很好的解释。这些例子可以通过an older edition of that book中的Google Book Search获得。

EN

回答 2

Stack Overflow用户

发布于 2009-01-30 20:16:06

下面显示了一个共享类库shared.h、cpp和一个使用该库的main.cpp模块的示例。这是一个非常简单的例子,makefile可以做得更好。但它是有效的,可能会对你有所帮助:

shared.h定义类:

代码语言:javascript
复制
class myclass {
   int myx;

  public:

    myclass() { myx=0; }
    void setx(int newx);
    int  getx();
};

shared.cpp定义了getx/setx函数:

代码语言:javascript
复制
#include "shared.h"

void myclass::setx(int newx) { myx = newx; }
int  myclass::getx() { return myx; }

main.cpp使用这个类,

代码语言:javascript
复制
#include <iostream>
#include "shared.h"

using namespace std;

int main(int argc, char *argv[])
{
  myclass m;

  cout << m.getx() << endl;
  m.setx(10);
  cout << m.getx() << endl;
}

以及生成libshared.so并将main链接到共享库的makefile:

代码语言:javascript
复制
main: libshared.so main.o
    $(CXX) -o main  main.o -L. -lshared

libshared.so: shared.cpp
    $(CXX) -fPIC -c shared.cpp -o shared.o
    $(CXX) -shared  -Wl,-soname,libshared.so -o libshared.so shared.o

clean:
    $rm *.o *.so

要实际运行'main‘并与libshared.so链接,您可能需要指定加载路径(或将其放在/usr/local/lib或类似目录中)。

下面指定当前目录作为库的搜索路径并运行main (bash语法):

代码语言:javascript
复制
export LD_LIBRARY_PATH=.
./main

要查看该程序是否与libshared.so链接,您可以尝试ldd:

代码语言:javascript
复制
LD_LIBRARY_PATH=. ldd main

我机器上的指纹:

代码语言:javascript
复制
  ~/prj/test/shared$ LD_LIBRARY_PATH=. ldd main
    linux-gate.so.1 =>  (0xb7f88000)
    libshared.so => ./libshared.so (0xb7f85000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7e74000)
    libm.so.6 => /lib/libm.so.6 (0xb7e4e000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb7e41000)
    libc.so.6 => /lib/libc.so.6 (0xb7cfa000)
    /lib/ld-linux.so.2 (0xb7f89000)
票数 56
EN

Stack Overflow用户

发布于 2009-01-30 20:20:45

基本上,您应该在代码中要使用共享库中的类的地方包含类的头文件。然后,当您链接时,使用use the '-l' flag将您的代码链接到共享库。当然,这要求.so位于操作系统可以找到的位置。请参阅3.5. Installing and Using a Shared Library

当您在编译时不知道要使用哪个库时,可以使用dlsym。这听起来不像是这样的。也许令人困惑的是,无论你是在编译时还是运行时(使用类似的方法)进行链接,Windows都会调用动态加载库?如果是这样,那么您可以将dlsym视为LoadLibrary的等价物。

如果您确实需要动态加载库(即,它们是插件),那么this FAQ应该会提供帮助。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/496664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档