为什么在这种情况下编译动态库错误?
why compiling a dynamic library error in this situation?
我在同一个路径下写了两个文件。
第一个文件名为 "dso.h".
//dso.cpp
#ifdef DSO_H
#define DSO_H
#include <string>
#include <map>
#include "spider.h"
using namespace std;
#define MODULE_OK 0
#define MODULE_ERR 1
#define MAGIC_MAJOR_NUMBER 1
#define MAGIC_MINOR_NUMBER 0
#define STANDARD_MODULE_STUFF MAGIC_MAJOR_NUMBER, MAGIC_MINOR_NUMBER,__FILE__
typedef struct Module{
int version;
int minor_version;
const char * name;
void (*init)(Module *);
int (*handle)(void *);
} MODULE;
class ModuleManager
{
public:
ModuleManager();
~ModuleManager();
int load(string path, string name);
MODULE * getModule(string name);
private:
map<string, MODULE*> m_modules;
};
#endif
第二个文件名为"testmodule.cpp"
#include "dso.h"
#include <stdio.h>
extern int handle(void * data){
printf("%s", (char *)data);
return MODULE_OK;
}
extern int init(Module * module){
module = &module;
return MODULE_OK;
}
Module mod
{
MODULE_MAJOR_VERSION,
MODULE_SUB_VERSION,
__FILE__,
init,
handle,
};
我尝试运行这个命令:
g++ -shared -fPIC -o testmodule.so testmodule.cpp
运行执行该命令后,出现一些错误,请参见下文
testmodule.cpp: In function ‘int handle(void*)’:
testmodule.cpp:6:10: error: ‘MODULE_OK’ was not declared in this scope
return MODULE_OK;
^~~~~~~~~
testmodule.cpp: At global scope:
testmodule.cpp:9:17: warning: ‘init’ initialized and declared ‘extern’
extern int init(Module * module){
^~~~~~
testmodule.cpp:9:17: error: ‘Module’ was not declared in this scope
testmodule.cpp:9:17: note: suggested alternative: ‘double’
extern int init(Module * module){
^~~~~~
double
testmodule.cpp:9:26: error: ‘module’ was not declared in this scope
extern int init(Module * module){
^~~~~~
testmodule.cpp:9:26: note: suggested alternative: ‘double’
extern int init(Module * module){
^~~~~~
double
testmodule.cpp:15:1: error: ‘Module’ does not name a type; did you mean ‘double’?
Module mod
^~~~~~
double
我无法获取动态库,如何解决这个问题?
运行在 ubuntu18.04TLS 中使用上面的命令 linux.
您似乎混淆了 dso.h 和 dso.cpp。
假设应该是 dso.h...
顶部的 include-guard 是错误的。
#ifdef DSO_H
#define DSO_H
...应该是
#ifndef DSO_H
#define DSO_H
或者header不会被解析!
我在同一个路径下写了两个文件。 第一个文件名为 "dso.h".
//dso.cpp
#ifdef DSO_H
#define DSO_H
#include <string>
#include <map>
#include "spider.h"
using namespace std;
#define MODULE_OK 0
#define MODULE_ERR 1
#define MAGIC_MAJOR_NUMBER 1
#define MAGIC_MINOR_NUMBER 0
#define STANDARD_MODULE_STUFF MAGIC_MAJOR_NUMBER, MAGIC_MINOR_NUMBER,__FILE__
typedef struct Module{
int version;
int minor_version;
const char * name;
void (*init)(Module *);
int (*handle)(void *);
} MODULE;
class ModuleManager
{
public:
ModuleManager();
~ModuleManager();
int load(string path, string name);
MODULE * getModule(string name);
private:
map<string, MODULE*> m_modules;
};
#endif
第二个文件名为"testmodule.cpp"
#include "dso.h"
#include <stdio.h>
extern int handle(void * data){
printf("%s", (char *)data);
return MODULE_OK;
}
extern int init(Module * module){
module = &module;
return MODULE_OK;
}
Module mod
{
MODULE_MAJOR_VERSION,
MODULE_SUB_VERSION,
__FILE__,
init,
handle,
};
我尝试运行这个命令:
g++ -shared -fPIC -o testmodule.so testmodule.cpp
运行执行该命令后,出现一些错误,请参见下文
testmodule.cpp: In function ‘int handle(void*)’:
testmodule.cpp:6:10: error: ‘MODULE_OK’ was not declared in this scope
return MODULE_OK;
^~~~~~~~~
testmodule.cpp: At global scope:
testmodule.cpp:9:17: warning: ‘init’ initialized and declared ‘extern’
extern int init(Module * module){
^~~~~~
testmodule.cpp:9:17: error: ‘Module’ was not declared in this scope
testmodule.cpp:9:17: note: suggested alternative: ‘double’
extern int init(Module * module){
^~~~~~
double
testmodule.cpp:9:26: error: ‘module’ was not declared in this scope
extern int init(Module * module){
^~~~~~
testmodule.cpp:9:26: note: suggested alternative: ‘double’
extern int init(Module * module){
^~~~~~
double
testmodule.cpp:15:1: error: ‘Module’ does not name a type; did you mean ‘double’?
Module mod
^~~~~~
double
我无法获取动态库,如何解决这个问题?
运行在 ubuntu18.04TLS 中使用上面的命令 linux.
您似乎混淆了 dso.h 和 dso.cpp。 假设应该是 dso.h...
顶部的 include-guard 是错误的。
#ifdef DSO_H
#define DSO_H
...应该是
#ifndef DSO_H
#define DSO_H
或者header不会被解析!