我试图在我的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/