为什么没有找到unixodbc函数的符号?

时间:2017-11-05 19:00:54

标签: c odbc clang unixodbc macos-high-sierra

我尝试在我的C程序中使用unixodbc,并且我已经包含了使用odbc函数所需的sql.h头文件。但是,出于某种原因,在尝试编译一个简单的示例文件时,我得到以下输出:

➜  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

1 个答案:

答案 0 :(得分:1)

将评论转移到答案中。

您的命令行没有提到您需要库,因此编译器不会与它链接。它找到了标题,因此在命令行上的对象(或源)文件之后,您可能只需要-lodbc。标头通知编译器。它们与链接器无关,并且链接器正在抱怨。

因此,在您的示例中,您应该能够编译并链接:

gcc -o sale sale.c -lodbc

而且,为了不熟悉Mac的人的利益,鉴于你是在Mac上,你的gcc sale.c命令行确实使用clang而不是真正的GNU {{1 - 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等工具有时用于帮助您收集项目所需的不同库集的必要标记。