1:我再開發了一個工程,用到了一個網上別人開發的讀取設定檔的標頭檔和C檔案,再ECLIPSE中編譯和調用都成功了的。但再GCC命令的時候卻說始終找不到調用的函數。
問題所在:沒有包括第三方的庫檔案。
我用一個例子來告訴你怎麼樣在 C++ 裡使用C的標頭檔/函數。
比方說我有一個C的標頭檔叫 c.h, C的源碼檔案叫 c.c,內容分別是
c.h:
#ifndef _ASDFD_INCLUDED_
#define _ASDFD_INCLUDED_
#include <stdio.h>
extern int test(int a);
#endif
c.c:
#include "c.h"
int test(int a)
{
printf("A = %d\n", a);
return a*a;
}
現在我想在c++中使用c.c中提供的函數test(),我的c++檔案名稱字叫 a.cpp,那麼裡面跟C有關的部分就要用 extern "C" {} 大括弧括起來,看看我的
a.cpp:
#include <iostream>
using namespace std;
extern "C"
{
#include "c.h"
}
int main()
{
int b = 12;
b = test(b);
cout<<"b = "<<b<<endl;
return 0;
}
看到了吧,#include "c.h" 被 extern "C" {}括起來了。
然後是如何編譯,先把C檔案編出目標檔案(.o)來
gcc -c c.c
你會看到產生了 c.o,其實,有目標檔案就夠了,如果你一定要做成(靜態/動態)庫檔案,也是可以的,不過我這裡就不深入了,做成庫和直接用目標檔案對解決你的問題沒有任何區別。
然後再編譯C++檔案,也就是我的 a.cpp
g++ -o hello a.cpp c.o
看到了吧,我在編譯 a.cpp 的時候把C產生的 c.o也加上了。 然後產生 可執行檔 hello, 運行
./hello
就可以看到
A = 12
b = 144
關於建立靜態庫,假定你有3個C檔案, a.c, b.c, c.c 提供了你C++要用到的介面,那麼可以把這三個C檔案編譯出來的目標檔案放到一個庫檔案裡供C++使用,方法為
先編譯出目標檔案
gcc -c a.c b.c c.c
這時候你應該看到有 a.o b.o c.o了
然後建立庫檔案
ar cr libtest.a a.o b.o c.o