2012-01-18 15 views
6

私は以下のライブラリを自分のコードに含めました。2つの外部ライブラリに同じ名前の関数の競合型を解決する

#include <minix/drivers.h> 
#include <curl/curl.h> 
#include <sys/stat.h> 
#include <time.h> 
#include <assert.h> 
#include <string.h> 

今、私は次のエラーを取得する:それが可能であれば

In file included from /usr/local/include/curl/curlbuild.h:152 
       from /usr/local/include/curl/curl.h:34 
       from xxx.c:2 
/usr/pkg/gcc44/lib/gcc/i686-pc-minix/4.4.3/include-fixed/sys/socket.h:134: error: conflicting types for '_send' 
/usr/include/minix/ipc.h:152: note: previous declaration was here 

は、私の知る限り、これは_sendは、2つのライブラリ(minix/drivers.hcurl/curl.h)で宣言されていることを意味知っているように、私は思っていましたこの問題を解決するか、何らかの方法で回避してください。

+2

この議論にはいくつかの戦略があります:私はあなたのコードが実行されようとしているまさに、頼むかもしれない場合 http://stackoverflow.com/questions/678254/c-function-conflict – TJD

+0

が。このようなオーバーラップが以前には起こらなかったのは変です。 –

+0

問題はリンク時ではなくコンパイル時に表示されています。あなたのプログラムに 'curl.h'と' drivers.h'の両方が必要ですか? –

答えて

1

あなたはminixにいるので、ライブラリの1つ(または両方)をobjcopyで変更できます。 manページから:

--redefine-sym old=new 
     Change the name of a symbol old, to new. This can be useful when 
     one is trying link two things together for which you have no source, 
     and there are name collisions. 

か、あなたはライブラリのいずれかから_send必要がない場合:もちろん

-L symbolname 
--localize-symbol=symbolname 
     Make symbol symbolname local to the file, so that it is not visible 
     externally. This option may be given more than once. 

を、あなたはそれに応じて、ヘッダーを更新する必要があります。私はまた、変更されたライブラリとヘッダーに別の名前を付けることをお勧めします。

+0

質問にLinuxが正確にどこに表示されていますか? – mlp

+0

良い点。私は誤ってminixがLinuxであると思っていた([それはない](http://www.minix3.org/))。しかし、[objcopyはまだ利用可能です](http://wiki.minix3.org/ja/DevelopersGuide/NewBuildSystem)。 –

関連する問題