2017-11-05 19 views
0

C 프로그램에서 unixodbc를 사용하려고하고 있는데, odbc 함수를 사용하는 데 필요한 sql.h 헤더 파일을 포함 시켰습니다. 어떤 이유로,하지만 시도 할 때 나는 다음과 같은 출력을 얻을 간단한 예제 파일을 컴파일 : 그는 ODBC가 제공하는 기능이 있어야된다왜 clang은 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) 

을, 그래서 나는 그들이 발견하지 않는 이유를 알고하지 않습니다 . Homebrew를 사용하여 unixodbc를 설치했고 OSX 10.13.1을 실행 중입니다.

+2

명령 줄에 라이브러리가 필요하다는 언급이 없으므로 컴파일러가 링크하지 않습니다. 헤더를 찾았으므로 명령 행에서 오브젝트 (또는 소스) 파일 뒤에'-lodbc' 만 있으면됩니다. 헤더는 컴파일러에게 알려줍니다. 이들은 링커와 관련이 없으며 불평하는 링커입니다. –

+0

@JonathanLeffler 감사합니다! 그 말이 맞았습니다. 답변으로 추가하여 올바른 것으로 표시해주세요. – dieortin

답변

1

답변을 메모로 전송.

명령 줄에 라이브러리가 필요하다는 언급이 없으므로 컴파일러는이 라이브러리와 링크하지 않습니다. 헤더를 찾았으므로 명령 행에서 오브젝트 (또는 소스) 파일 뒤에 -lodbc이 필요합니다. 헤더는 컴파일러에게 알려줍니다. 이들은 링커와 관련이 없으며 불평하는 링커입니다. 당신의 gcc sale.c 당신이 맥에있어 주어진, 맥에 익숙하지 않은 사람들의 이익을 위해,

gcc -o sale sale.c -lodbc 

그리고 :

따라서, 귀하의 예제에서, 당신은 컴파일 할 수 있어야합니다 및 링크 커맨드 라인은 정품 GNU가 아닌 clang을 사용합니다 gcc - /usr/bin/gcc은 실제로 clang 컴파일러에 대한 참조입니다. 머리글 라이브러리는 -L/opt/unixodbc/lib 같은 옵션을 사용하여 한 곳 당신은 또한 지정할 필요했을 것 같은 -I/opt/unixodbc/include 같은 옵션을 사용하여 한 곳을 지정하기 위해 필요하다고 발견 한 경우

$ /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 
$ 

.

유닉스 계열 시스템 (리눅스, BSD, 맥 OS, AIX, HP-UX, 솔라리스, ...)의 '기본 위치'(이 예에서는 /opt/unixodbc이) 매우 변수에
gcc -o sale -I/opt/unixodbc/include sale.c -L/opt/unixodbc/lib -lodbc 

하지만 공통적이다 기본 위치 아래의 include 디렉토리에 헤더를 설치하고 기본 위치 아래의 lib 디렉토리에있는 라이브러리를 설치하십시오. pkg-config과 같은 도구가 있는데, 때로는 프로젝트에 필요한 여러 라이브러리 세트에 필요한 플래그를 수집하는 데 도움이됩니다.