makefile:
all:
g++ map.cpp -o map.so -shared
g++ main.cpp -o main -ldl
clean:
rm -rf main
rm -rf map.so
map.cpp
#include <vector>
#include <map>
#include <string>
using namespace std;
extern "C"
{
void map(std::string input_text, multimap<std::string, std::string>& output)
{
output.insert(multimap<std::string, std::string>::value_type("1", input_text));
}
}
main.cpp
#include <stdio.h>
#include <dlfcn.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
void* handle;
char* error;
int (*map)(std::string, std::multimap<std::string, std::string>& output);
handle = dlopen("./map.so", RTLD_LAZY);
*(void **)(&map) = dlsym(handle, "map");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s/n", error);
exit(1);
}
string input="hello world";
std::multimap<std::string, std::string> output;
(*map)(input, output);
std::multimap<std::string, std::string>::iterator it;
for(it=output.begin(); it!=output.end(); it++)
{
cout << it->first << " : " << it->second << endl;
}
return 0;
}
可以看出extern "C" 只是在改变名字的使用方式,并不去做语法检查