这是Dynamic Shared Library compilation with g++的后续版本。
我正在尝试用Linux上的C++创建一个共享类库。我能够编译这个库,并且可以使用我找到的here和here教程调用一些(非类)函数。当我尝试使用库中定义的类时,我的问题就开始了。我链接到的第二个教程展示了如何加载符号来创建库中定义的类的对象,但没有使用这些对象来完成任何工作。
有没有人知道关于创建共享C++类库的更完整的教程,它还展示了如何在单独的可执行文件中使用这些类?一个非常简单的教程,展示了对象的创建、使用(简单的getter和setter就可以了),还有删除就很棒了。说明共享类库的用法的一些开放源代码的链接或引用也同样好。
虽然来自codelogic和nimrodm的答案确实有效,但我只想补充一句,在提出这个问题后,我拿起了一份Beginning Linux Programming,它的第一章有示例C代码和创建和使用静态和共享库的很好的解释。这些例子可以通过an older edition of that book中的Google Book Search获得。
发布于 2009-01-30 20:16:06
下面显示了一个共享类库shared.h、cpp和一个使用该库的main.cpp模块的示例。这是一个非常简单的例子,makefile可以做得更好。但它是有效的,可能会对你有所帮助:
shared.h定义类:
class myclass {
int myx;
public:
myclass() { myx=0; }
void setx(int newx);
int getx();
};
shared.cpp定义了getx/setx函数:
#include "shared.h"
void myclass::setx(int newx) { myx = newx; }
int myclass::getx() { return myx; }
main.cpp使用这个类,
#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:
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语法):
export LD_LIBRARY_PATH=.
./main
要查看该程序是否与libshared.so链接,您可以尝试ldd:
LD_LIBRARY_PATH=. ldd main
我机器上的指纹:
~/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)
发布于 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应该会提供帮助。
https://stackoverflow.com/questions/496664
复制相似问题