2017-11-05 10 views
0

Cプログラムでunixodbcを使用しようとしていますが、odbc関数を使用するために必要なヘッダファイルsql.hが含まれています。簡単な例ファイルをコンパイルしようとしたときにいくつかの理由については、しかし、私は次のような出力が得られます。なぜunixodbc関数のシンボルが見つからないのですか?

➜ practica2 gcc sale.c 
Undefined symbols for architecture x86_64: 
    "_SQLAllocHandle", referenced from: 
     _main in sale-179b46.o 
    "_SQLDescribeCol", referenced from: 
     _main in sale-179b46.o 
    "_SQLExecDirect", referenced from: 
     _main in sale-179b46.o 
    "_SQLFetch", referenced from: 
     _main in sale-179b46.o 
    "_SQLGetData", referenced from: 
     _main in sale-179b46.o 
    "_SQLNumResultCols", referenced from: 
     _main in sale-179b46.o 
    "_odbc_connect", referenced from: 
     _main in sale-179b46.o 
    "_odbc_disconnect", referenced from: 
     _main in sale-179b46.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

ものは、ODBCが提供する機能のことになっているので、彼らが発見していない理由を私は知りません。私はHomebrewを使ってunixodbcをインストールしました。OSX 10.13.1を実行しています。

+2

コマンドラインにライブラリが必要であるとは言わないので、コンパイラはそれをリンクしません。ヘッダを見つけるので、コマンドライン上のオブジェクト(またはソース)ファイルの後ろに '-lodbc'だけ必要なものがあります。ヘッダーはコンパイラに通知します。これらはリンカーとは関係がなく、不平を言っているリンカーです。 –

+0

@JonathanLefflerありがとう!それが正しかった、私はそれを正しいとマークすることができるように答えとして追加してください – dieortin

答えて

1

コメントを回答に転送しています。

あなたのコマンドラインには、ライブラリが必要であることは記載されていないので、コンパイラはリンクしていません。それはヘッダを見つけるので、おそらくあなたが必要とするのはコマンドライン上のオブジェクト(またはソース)ファイルの後ろに-lodbcです。ヘッダーはコンパイラに通知します。これらはリンカーとは関係がなく、不平を言っているリンカーです。

したがって、あなたの例では、あなたが使用してコンパイルとリンクすることができるはずです:あなたがMac上でていることを考えると、

gcc -o sale sale.c -lodbc 

そして、Macに慣れていない方の利益のために、あなたのgcc sale.cコマンドラインは実際には本物のGNUではなくclangを使用しますgcc - /usr/bin/gccは実際にはclangコンパイラへの参照です。

$ /usr/bin/gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 9.0.0 (clang-900.0.38) 
Target: x86_64-apple-darwin17.2.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 
$ 

あなたはヘッダは、このような-I/opt/unixodbc/includeなどのオプションを使用していた場所を指定する必要があったことが判明した場合、あなたはまた、ライブラリは、このような-L/opt/unixodbc/libなどのオプションを使用していた場所を指定する必要でしょう。 Unixライクなシステム(Linuxでは、BSD、MacOSの、AIX、HP-UX、Solarisの、...)に

gcc -o sale -I/opt/unixodbc/include sale.c -L/opt/unixodbc/lib -lodbc 

、 'ベース位置'(この例では/opt/unixodbcは)非常に変数ですが、それは共通ですベースの場所のincludeディレクトリにヘッダーをインストールし、ベースの場所のlibディレクトリのライブラリをインストールします。 pkg-configのようなツールがあり、プロジェクトに必要なさまざまなライブラリセットに必要なフラグを収集するのに役立つことがあります。

関連する問題