Re: Linking a C program to a C++ library which uses STL
I looked at the C++ faq at http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html,
and wrote some simple code to experiment.
But in the end, the compiler complains about not recognize "extern".
Here is what I did.
First, I compiled a lib.a, which is made of lib.h, lib.cpp, and
Makefile.
Here is the code.
lib.h
=====
#ifndef _LIB_H_
#define _LIB_H_
typedef int integer;
extern "C" void push_into( integer i );
extern "C" void show();
#endif
lib.cpp
=======
#include "lib.h"
#include <iostream>
#include <vector>
using namespace std;
vector< int > vec;
void push_into( integer i )
{
vec.push_back( i );
}
void show()
{
for( integer i = 0; i < vec.size() ; i++ )
cout<< vec[i] << " ";
cout<< endl;
}
Makefile
========
G=g++
OBJ=lib.o
lib.a: $(OBJ)
ar rcs $@ $(OBJ)
lib.o: lib.cpp lib.h
$(GG) -g -c lib.cpp
clean:
\rm $(OBJ) lib.a
The Makefile uses g++, and generates lib.a. The command "ar" archived
lib.o into lib.a.
Then I have another two files, main.c and Makfile.1. main.c must
include "lib.h" since "lib.h" is the interface to my library.
main.c
======
#include <stdio.h>
#include "lib.h"
main(int argv, char** args)
{
integer a = 3;
push_into( a );
show();
}
Makefile.1
==========
GG=gcc
OBJ=main.o
main: $(OBJ)
$(GG) -g -o $@ $(OBJ) lib.a
main.o: main.c
$(GG) -g -c main.c
clean:
\rm $(OBJ) main
Makefile.1 uses gcc since main.c is written in C. (If I use g++ here,
there is no errors. But I do want to test my library under C
environment.)
Finally, here is the compiler error.
gcc -g -c main.c
In file included from main.c:2:
lib.h:7: error: expected identifier or '(' before string constant
lib.h:8: error: expected identifier or '(' before string constant
make: *** [main.o] Error 1
What should I do to make it work?