我尝试在我的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
答案 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
等工具有时用于帮助您收集项目所需的不同库集的必要标记。