我正在尝试使用简单的c ++程序来使用dll中的方法。我已经收到了各种各样的错误,因为我已经调整了代码并且大部分都被卡住了,就像下面发布的代码一样,“未定义引用”方法。下面的代码编译如下。
g++ -c testdll.cpp
g++ -shared -o testdll.dll testdll.o
g++ -o test test.cpp -L./ -ltestdll
错误
g++ -o test test.cpp -L./ -ltestdll
C:\Users\ROGERF~1\AppData\Local\Temp\cca9YhFn.o:test.cpp:(.text+0x53): undefined
reference to `__imp__ZN7TestDLL9writeDataESs'
collect2.exe: error: ld returned 1 exit status
我不知道为什么目录C:\ Users \ ROGERF~1 \ AppData \ Local \ Temp \参与了这个过程。在我开始在头文件中使用Microsoft网站的代码之后出现了这一点。以前,我只是未定义引用'writeData'
testdll.cpp
#include <stdio.h>
#include <string>
using namespace std;
class TestDLL {
public:
string data1;
public: void writeData (string s) {
printf ("%s \n", s.c_str());
}
};
TestDLL.h
#ifndef TESTDLL_H
#define TESTDLL_H
#ifdef TRADITIONALDLL_EXPORTS
#define TRADITIONALDLL_API __declspec(dllexport)
#else
#define TRADITIONALDLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
class TestDLL {
public:
std::string data1;
public:
TRADITIONALDLL_API void writeData (std::string);
};
#ifdef __cplusplus
}
#endif
#endif // TESTDLL_H
TEST.CPP
#include <string>
#include "TestDLL.h"
using namespace std;
class TestDLL;
int
main () {
TestDLL testdll;
testdll.writeData ("success");
}
扩展说明:我把重点放在易于发布的内容上,希望有人能够轻松回答。在PC时代初期,我还是一名C程序员,但从那时起C ++或C都做不了多少。我已经成为一名Java程序员已经有一段时间了(还有网络内容)。现在,我正在处理一个可以使用dll扩展的现有程序,并且需要将dll连接到用Java编写的系统。我已经完成了JNI的第一步,所以我将Java连接到一个dll。但架构必须是:
现有C应用程序 - dll扩展 - 用于JNI的dll - Java系统
通过双向沟通。答案 0 :(得分:1)
如果将以下两行添加到testdll.cpp会发生什么:
#define TRADITIONALDLL_EXPORTS 1
#include "TestDLL.h"
我怀疑发生的事情是你没有这样做,所以GCC不知道用DLL导出链接编译TestDLL::writeData()
。