3

OSXでコンパイルできることがわかっているコードをLinuxでコンパイルしようとしていますが、いくつかの問題が発生しています。

すべてのファイルには .h という名前のヘッダーがあり、すべてのファイルは同じディレクトリにあります。私はこのようにコンパイルしています:

gcc *.c -std=c99 -lpthread

また、このコードは OSX でコンパイルされますが、Ubuntu のインストールで一連の奇妙なリンカー エラーが発生します。いくつかのコンパイラ オプションがありませんか? gccこれは、追加のパッケージがインストールされたデフォルトの Ubuntu サーバー インストールbuild-essentialです。

In file included from errorLogger.h:24:0,
                 from configParser.h:17,
                 from configParser.c:9:
signalHandling.h:24:18: error: unknown type name ‘sigset_t’
configParser.c: In function ‘parseConfigFile’:
configParser.c:114:5: warning: implicit declaration of function ‘getline’ [-Wimplicit-function-declaration]
In file included from errorLogger.h:24:0,
                 from global.h:18,
                 from connection.h:19,
                 from connection.c:10:
signalHandling.h:24:18: error: unknown type name ‘sigset_t’
connection.c: In function ‘createConnectionQueue’:
connection.c:189:28: warning: assignment makes integer from pointer without a cast [enabled by default]
In file included from errorLogger.h:24:0,
                 from database.h:16,
                 from database.c:9:
signalHandling.h:24:18: error: unknown type name ‘sigset_t’
In file included from errorLogger.h:24:0,
                 from errorLogger.c:10:
signalHandling.h:24:18: error: unknown type name ‘sigset_t’
errorLogger.c: In function ‘reportError’:
errorLogger.c:63:5: warning: implicit declaration of function ‘strerror_r’ [-Wimplicit-function-declaration]
errorLogger.c: In function ‘logMessage’:
errorLogger.c:87:5: warning: implicit declaration of function ‘localtime_r’ [-Wimplicit-function-declaration]
errorLogger.c: In function ‘processErrorQueue’:
errorLogger.c:131:17: warning: implicit declaration of function ‘open’ [-Wimplicit-function-declaration]
errorLogger.c:131:57: error: ‘O_APPEND’ undeclared (first use in this function)
errorLogger.c:131:57: note: each undeclared identifier is reported only once for each function it appears in
errorLogger.c:131:68: error: ‘O_CREAT’ undeclared (first use in this function)
errorLogger.c:131:78: error: ‘O_WRONLY’ undeclared (first use in this function)
errorLogger.c:131:88: error: ‘S_IWRITE’ undeclared (first use in this function)
errorLogger.c:131:99: error: ‘S_IREAD’ undeclared (first use in this function)
errorLogger.c:146:13: warning: implicit declaration of function ‘fsync’ [-Wimplicit-function-declaration]
errorLogger.c: In function ‘startErrorLogger’:
errorLogger.c:167:36: error: ‘O_APPEND’ undeclared (first use in this function)
errorLogger.c:167:47: error: ‘O_CREAT’ undeclared (first use in this function)
errorLogger.c:167:57: error: ‘O_WRONLY’ undeclared (first use in this function)
errorLogger.c:167:67: error: ‘S_IWRITE’ undeclared (first use in this function)
errorLogger.c:167:78: error: ‘S_IREAD’ undeclared (first use in this function)
errorLogger.c:214:57: error: ‘O_EXCL’ undeclared (first use in this function)
errorLogger.c:231:27: warning: assignment makes integer from pointer without a cast [enabled by default]
errorLogger.c: In function ‘closeErrorLogger’:
errorLogger.c:246:9: warning: implicit declaration of function ‘pthread_kill’ [-Wimplicit-function-declaration]
In file included from errorLogger.h:24:0,
                 from global.h:18,
                 from global.c:9:
signalHandling.h:24:18: error: unknown type name ‘sigset_t’
In file included from main.c:23:0:
signalHandling.h:24:18: error: unknown type name ‘sigset_t’
main.c: In function ‘main’:
main.c:53:5: warning: implicit declaration of function ‘blockSignals’ [-Wimplicit-function-declaration]
main.c:61:45: error: invalid application of ‘sizeof’ to incomplete type ‘struct addrinfo’ 
main.c:62:29: error: invalid application of ‘sizeof’ to incomplete type ‘struct addrinfo’ 
main.c:64:10: error: dereferencing pointer to incomplete type
main.c:65:10: error: dereferencing pointer to incomplete type
main.c:66:10: error: dereferencing pointer to incomplete type
main.c:66:23: error: ‘AI_PASSIVE’ undeclared (first use in this function)
main.c:66:23: note: each undeclared identifier is reported only once for each function it appears in
main.c:69:5: warning: implicit declaration of function ‘getaddrinfo’ [-Wimplicit-function-declaration]
main.c:73:9: warning: implicit declaration of function ‘gai_strerror’ [-Wimplicit-function-declaration]
main.c:73:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Wformat]
main.c:73:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Wformat]
main.c:81:41: error: dereferencing pointer to incomplete type
main.c:83:30: error: dereferencing pointer to incomplete type
main.c:83:46: error: dereferencing pointer to incomplete type
main.c:83:64: error: dereferencing pointer to incomplete type
main.c:96:30: error: dereferencing pointer to incomplete type
main.c:96:44: error: dereferencing pointer to incomplete type
main.c:112:5: warning: implicit declaration of function ‘freeaddrinfo’ [-Wimplicit-function-declaration]
main.c:138:9: error: unknown type name ‘fd_set’
main.c:142:9: warning: implicit declaration of function ‘FD_ZERO’ [-Wimplicit-function-declaration]
main.c:143:9: warning: implicit declaration of function ‘FD_SET’ [-Wimplicit-function-declaration]
main.c:145:9: warning: implicit declaration of function ‘pselect’ [-Wimplicit-function-declaration]
In file included from signalHandling.c:10:0:
signalHandling.h:24:18: error: unknown type name ‘sigset_t’
signalHandling.c:12:18: error: unknown type name ‘sigset_t’
signalHandling.c: In function ‘setHandler’:
signalHandling.c:51:53: error: invalid application of ‘sizeof’ to incomplete type ‘struct sigaction’ 
signalHandling.c:52:36: error: invalid application of ‘sizeof’ to incomplete type ‘struct sigaction’ 
signalHandling.c:54:5: warning: implicit declaration of function ‘sigemptyset’ [-Wimplicit-function-declaration]
signalHandling.c:54:30: error: dereferencing pointer to incomplete type
signalHandling.c:60:9: warning: implicit declaration of function ‘sigaddset’ [-Wimplicit-function-declaration]
signalHandling.c:60:35: error: dereferencing pointer to incomplete type
signalHandling.c:67:17: error: dereferencing pointer to incomplete type
signalHandling.c:72:9: warning: implicit declaration of function ‘sigaction’ [-Wimplicit-function-declaration]
4

3 に答える 3

12

#includeLinux ではなく、OS X では暗黙的に導入されている sがおそらくいくつかありません。

エラー メッセージから判断すると、少なくとも次のものが含まれていない可能性があります。

  • <signal.h>sigset_tその他の場合)
  • <fcntl.h>(の場合O_*)
  • <unistd.h>(たくさんのもののために)
  • <netdb.h>(各種ネットワーク機能・定数用)
  • <stdio.h>(の場合getline)

_POSIX_C_SOURCEまた、 やなどの特定のシステム依存関数を取得するために、いくつかの機能マクロ ( など) を定義する必要がある場合もありstrerror_rますpselect

于 2012-08-25T01:34:07.193 に答える
5

当面の目的は、コードをコンパイルすることであり、それが完了したら、戻ってソースを修正し、両方のプラットフォームですぐに動作するようにすることを想定しています。つまり、ハッキングは非常に短期的に許容されます。移植性の問題が何であるかについての知識を得るにつれて、それらは適切に修正されます。(それが慰めになるとすれば、通常、ソフトウェアが最初に開発されたシステムに代わる最初の代替システムが最も困難であり、その後は一般的に簡単になります。)

最初に試すことは次のとおりです。

gcc *.c -std=gnu99 -lpthread

これにより、システム ヘッダー ファイルは、より多くのシンボルを定義するように指示されます-std=c99。(このトピックには異論がありますが、それは問題ありません。少なくとも、コンパイルに追加-pedanticする場合-std=c99、POSIX サポートも要求しない限り、POSIX で定義された標準 C ヘッダーのシンボルは公開されません — 以下を参照してください。その場合-pedantic、静かに次の推奨事項に進みます。これは、POSIX システムへの将来の移植性の基礎となります。)

それでも軌道に乗るには不十分な場合は、おそらく次のようなものを使用する必要があります。

gcc *.c -std=gnu99 -D_XOPEN_SOURCE=700 -lpthread

これは、「POSIX 2008 に対応する POSIX および X/Open 関数を提供してください」と書かれています。古いバージョンでは 600 と 500 を試すことができますが、Linux ではおそらくその必要はありません。_XOPEN_SOURCEいずれ、構成ヘッダーまたは構成ツールを介して自動的に設定される可能性があります。コンパイルするものを取得している間は、コマンド ラインで指定しても問題ありません。いずれ、シェルでコマンドラインをmakefile入力するのではなく、または同等のものを使用してコンパイルを制御するようになります。)gcc

はPOSIXsigset_tで定義されています。<signal.h>したがって、明示的に POSIX サポートを要求すると、適切に再コンパイルする必要があります。undeclaredなどの型が引き続き取得される場合はsigset_t、Mac OS X に などの標準ヘッダーを含むヘッダーが存在する必要がありますが、<signal.h>Linux では無関係なタスクを実行します (したがって、 は含まれません<signal.h>)。これには、ソース コードの精査が必要です。ただし、必要になる可能性は比較的低いです。

于 2012-08-25T01:33:17.277 に答える
2

異なるシステム ヘッダーには他の異なるシステム ヘッダーが含まれるため、追加のヘッダー ファイルを含める必要があります。

また、たとえば、gcc は、含めるべきではないヘッダーを含めないように懸命に取り組んできました。

sigset_tが定義されている場所signalHandling.hを含めていますか?#include <signal.h>

編集

OPと話した後、問題はコンパイル/リンクの問題だったようです。最初にソースをオブジェクト ファイルにコンパイルし、次にそれらをリンクすることで、問題が解決したようです。

于 2012-08-25T01:33:49.207 に答える