C++关于Dll

如下三段代码:
//test.hpp
#ifndef TEST_H
#define TEST_H

#ifndef TEST_API
#define TEST_API
#endif

#ifdef TEST_EXPORTS
#undef TEST_API
#define TEST_API __declspec(dllexport)
#endif
#ifdef TEST_IMPORTS
#undef TEST_API
#define TEST_API __declspec(dllimport)
#endif

namespace test {
class TEST_API test
{
public:
test();
virtual ~test()
{
}
void print(char* str);
void operator<<(char* str);
};
extern TEST_API int test_int;
}
#endif

//test.cpp
#include "test.hpp"
#include <iostream>
namespace test {
TEST_API test::test()
{
}
TEST_API void test::print(char* str)
{
(*this)<<str;
}
TEST_API void test::operator<<( char* str)
{
std::cout<<str<<std::endl;
}
TEST_API int test_int = 101;
}

//T.cpp
#include <iostream>
#include "test.hpp"
using namespace std;

int main(int argc, char *argv[])
{
cout<<"the number is : "<<test::test_int<<endl;
test::test t;
t<<"hello";
return 0;
}
首先使用命令行:cl /LD /MT /EHsc /D"TEST_EXPORTS" test.cpp  生成test.dll以及test.lib
然后命令行: cl /MT /EHsc /D"TEST_IMPORTS" T.cpp /link test.lib 生成T.exe
注意两者使用/MD或者/MT要统一,然后就是生成exe时必须使用/D"TEST_IMPORTS",否则test_int是无法导出的(无法解析的外部符号 "int test::test_int" (?test_int@test@@3HA) )。
但是我由于对C++还不怎么熟悉,有一点很是不明白:如果 test::test t;我写为 test::test t();,那么编译时错误就会为:
T.cpp(9) : error C2296: '<<' : illegal, left operand has type 'test::test (__cdecl *)(void)'
T.cpp(9) : error C2297: '<<' : illegal, right operand has type 'const char [6]'
按理说test类的构造函数就是没有参数,怎么会使用了空括号之后就出现问题呢。为此我加了一个print函数,对print的调用与此一致。

你可能感兴趣的:(C++,c,api,Class,dll,exe)