2016-03-23 7 views
0

ocilibとmysqlヘッダーを使用するC言語のコードがあります。 私のマシンの中にはocilibやmysqlがありません。私はヘッダーなしでコードをコンパイルすることができますか? は、コードにocilibとmysqlが定義されていると言う必要があるので、おそらくコンパイル時にそれらを配置したいと思うでしょう。Cで選択したヘッダーコードをコンパイルできますか?

例:

#include <regex.h> 
#include <time.h> 
#include <ocilib.h> 


void main(){ 
MYSQL *conn; 
OCI_Connection* cn; 
OCI_Statement* st; 
char *db_type=NULL; 
..... 
.... 
if (strcasestr(db_type,"mysql")){/* mysql */ 
if (!mysql_real_connect(conn, db_host,db_user, db_password, db_schemata, 0, NULL, 0)) { 
     syslog (LOG_NOTICE,"%s\n", mysql_error(conn)); 
     return; 
    } 
.... 
}else{/* oracle*/ 
OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT); 
.... 
} 
} 

は、私は十分に明確.. のおかげでしたね!

+1

あなたのコードが特定のヘッダーなしでコンパイルされた場合、それらを最初に組み込む理由は何ですか?しかし、ocilib.hをインクルードしていないと、コードがコンパイルされることはありません。 –

+0

いくつかのマシンではocilibがインストールされていませんが、いくつかのマシンではmysqlがインストールされていません。 – Mojo

+2

ocilibヘッダーが利用できないとき、どのようにocilibを使用するコードをコンパイルすると思いますか?利用可能なCコンパイラがない場合、Cコードをコンパイルできることを期待しているのとほぼ同じです。 –

答えて

1

対応する#includeディレクティブのコンパイルを選択的に有効または無効にするコードに、条件付きコンパイルディレクティブ(#ifdef ... #endif)を挿入することができます。しかし、@MichaelWalzがコメントで見ているように、ヘッダーだけを抑制すると残りのコードが破損する可能性があります。そうでなければ、#includeを削除してください。

さらに、特定の環境にヘッダーがない場合、それらのヘッダーで宣言された関数を含むライブラリもない可能性があります。コードがこれらの関数の一部に依存しているためヘッダーをインクルードすると、コンパイルしたプログラム、ヘッダーまたはヘッダーはリンクできなくなります。

条件付きコンパイルソリューションは、関連するヘッダーを含め、特定のライブラリの機能に対するすべての依存を取り除くために、コード内のどこでも使用する場合にのみ機能します。そのアプローチは比較的一般的ですが、最初に設計されていないシステムに改造するのは容易ではありません。

+0

大丈夫です。 が '#define'と' #ifdef'を使用していて、すべて動作します。 ありがとうございました! – Mojo

関連する問題