2016-09-15 83 views
-3

我已通过多个堆栈溢出职位消失,试图执行下面的例子与C++对象类 我具有以下的代码使用的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. 我无法使用createA在对dlsym
  2. 我越来越未定义的引用`A :: A(),即使我不使用的dlsym
  3. 我的查询是什么是正确的是使用C++类对象的dlsym
  4. 从dlopen的风云人物,我不能够推断出是RTLD_LAZY RTLD_GLOBAL RTLD_NOW标志
+0

C不能处理的类。 –

+0

这是C++代码 – TechEnthusiast

+0

'extern“C”A * createA()'明确表示它不是。 –

回答

0

只要把在命令行的意义:

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

,当然还有 - 当你想在本地运行,需要-rpath

.. -Wl,-rpath ./ 
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; 
}