使用C ++类对象时出现未定义的引用错误

时间:2016-09-15 05:21:48

标签: c++ gcc linker shared-libraries dlopen

我经历了多个堆栈溢出帖子并尝试实现以下使用dlopen和c ++对象类的示例 我有以下代码。

1)文件hello.cc

#include <stdio.h>
#include "hello.h"
A::A() {
    init1();
} 
void A::init1() {
    printf("\n init ");
} 

2)文件hello.h

#include <iostream>
class A {
    public: 
         A();
         void init1();
         inline void fun () { cout << "\n Inside fun"; }
 };


 extern "C" A* createA() {
   return new A;
 }

}

3)文件main.cpp

#include<iostream>
#include<dlfcn.h>
#include "hello.h" 
using namespace std;
int main() {
    void *handle;
    handle = dlopen("./libhello.so", RTLD_LAZY | RTLD_GLOBAL);
    if (!handle) {
      cout << "The error is " << dlerror();
    }
    return 0 ;
 }

我正在使用以下步骤来创建共享库

1) g++ -g -fPIC -c hello.cc
2) g++ -g -shared -o libhello.so hello.o
3) g++ -g -o myprog main.cpp -

main.cpp:(.text+0x18): undefined reference to `A::A()' . The function createA in hello.h is declared so the same can be used to dlsym
  1. 我无法在dlsym中使用createA
  2. 即使我不使用dlsym
  3. ,我也会得到未定义的引用`A :: A()
  4. 我的查询是正确的是在dlsym中使用C ++类对象
  5. 来自dlopen的人我无法推断出RTLD_LAZY RTLD_GLOBAL RTLD_NOW标志的重要性

2 个答案:

答案 0 :(得分:0)

只需输入命令行:

g++ -g -o myprog main.cpp -l hello -l dl  -L ./

当然 - 当你想在本地运行它时,需要使用-rpath

进行编译
.. -Wl,-rpath ./

答案 1 :(得分:0)

更正了hello.h:

/* hello.h */

#include <cstdio>

class A {
    public: 
         A();
         void init1();
         inline void fun () { printf ("A::fun (this=%p)\n", this); }
 };

extern "C" A* createA();

hello.cc:

/* hello.cc */

#include <cstdio>

#include "hello.h"

A::A() {
    init1();
}

void A::init1() {
    printf("A::init1 this=%p\n", this);
}

extern "C" A* createA() {
    return new A;
} 

main.cc:

/* main.cc */

#include <cstdio>
#include <iostream>
#include <dlfcn.h>
#include "hello.h"

using namespace std;

typedef A *fun_createA();

int main() {
    void *handle;
    fun_createA *ptr_createA;
    A *myA;

    handle = dlopen("./libhello.so", RTLD_LAZY | RTLD_GLOBAL);
    if (!handle) {
      cout << "The error is " << dlerror();
    }
    ptr_createA = (fun_createA *)dlsym (handle, "createA");
    printf ("ptr_createA is %p\n", ptr_createA);

    myA = ptr_createA ();
    printf ("ptr_createA gave me %p\n", myA);

    myA->fun ();

    return 0;
}