我试图在我的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提供的函数,所以我不知道为什么没有找到它们。我用自制软件安装了unixodbc,运行的是OSX 10.13.1

最佳答案

将评论转换为答案。
您的命令行没有提到您需要这个库,所以编译器不会与之链接。它会找到头,所以您可能只需要在命令行上的对象(或源)文件之后-lodbc。报头通知编译器。它们与链接器无关,是链接器在抱怨。
因此,在您的示例中,您应该能够编译并链接到:

gcc -o sale sale.c -lodbc

而且,对于那些不熟悉Macs的人来说,考虑到您在Mac上,您的gcc sale.c命令行确实使用了clang而不是真正的GNUgcc-/usr/bin/gcc编译器。
$ /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
$

如果您发现有必要指定头使用clang等选项的位置,则还需要指定库使用-I/opt/unixodbc/include等选项的位置。
gcc -o sale -I/opt/unixodbc/include sale.c -L/opt/unixodbc/lib -lodbc

在类Unix系统(Linux、BSD、macOS、AIX、HP-UX、Solaris,…)上,“基本位置”(-L/opt/unixodbc/lib在本例中)是非常可变的,但通常在基本位置下的/opt/unixodbc目录中安装头,在基本位置下的include目录中安装库。
有些工具(如lib)有时用于帮助您收集项目所需的不同库集的必需标志。

关于c - 为什么clang找不到unixodbc函数的符号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47125406/

10-10 16:09