Linking error (cygwin, make, windows, sql)

P

PG

I am trying to compile a simple ODBC and C example on Windows XP SP2.
I have Cygwin_NT 5.1.

This is the code (obtained from
http://www.easysoft.com/developer/languages/c/odbc_tutorial.html#dm_f...)
i am attempting to compile.

ODBCTest.c

#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>

main() {
SQLHENV env;
char dsn[256];
char desc[256];
SQLSMALLINT dsn_ret;
SQLSMALLINT desc_ret;
SQLUSMALLINT direction;
SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);

direction = SQL_FETCH_FIRST;
while(SQL_SUCCEEDED(ret = SQLDataSources(env, direction,
dsn, sizeof(dsn), &dsn_ret,
desc, sizeof(desc),
&desc_ret))) {
direction = SQL_FETCH_NEXT;
printf("%s - %s\n", dsn, desc);
if (ret == SQL_SUCCESS_WITH_INFO) printf("\tdata truncation\n");
}

}

Makefile

CC=gcc
INCPATH=-I/usr/include -Iinclude
LIBS=-L. -lodbc32
LD=ld
all: clean ODBCTest.exe

ODBCTest.o : ODBCTest.c
$(CC) $(INCPATH) $(CFLAGS) -o ODBCTest.o -c ODBCTest.c
ODBCTest.exe : ODBCTest.o
$(CC) $(LIBS) $(CFLAGS) -o ODBCTest.exe ODBCTest.o
clean:
-rm *.o
-rm *.exe


Make output and Errors:

$ make
rm *.o
rm *.exe
rm: cannot remove `*.exe': No such file or directory
make: [clean] Error 1 (ignored)
gcc -I/usr/include -Iinclude -o ODBCTest.o -c ODBCTest.c
gcc -L. -lodbc32 -o ODBCTest.exe ODBCTest.o
ODBCTest.o:ODBCTest.c:(.text+0x4a): undefined reference to
`_SQLAllocHandle@12'
ODBCTest.o:ODBCTest.c:(.text+0x70): undefined reference to
`_SQLSetEnvAttr@16'
ODBCTest.o:ODBCTest.c:(.text+0xca): undefined reference to
`_SQLDataSources@32'
collect2: ld returned 1 exit status
make: *** [ODBCTest.exe] Error 1


Things i have checked:
libodbc32.a exists in c:\cygwin\lib\w32api.
If i remove the above lib, i get a "lib not found" kind of error when
i run make, meaning this is the lib make is using and there is no path
issue.
if i edit libodbc32.a in a binary editor, i can see the all the three
functions mentioned in the error (_SQLAllocHandle@12,
_SQLSetEnvAttr@16 and _SQLDataSources@32) exist.

How can i fix these linking errors?

Thanks

PG
 
I

Ian Collins

PG said:
I am trying to compile a simple ODBC and C example on Windows XP SP2.
I have Cygwin_NT 5.1.
Why cross-post this to three groups where it is off topic? Try one of
the many windows programming groups.
 
F

Flash Gordon

PG wrote, On 08/03/08 18:21:
I am trying to compile a simple ODBC and C example on Windows XP SP2.
I have Cygwin_NT 5.1.

Since you are not using C why cross-post to a C++ group?
This is the code (obtained from
http://www.easysoft.com/developer/languages/c/odbc_tutorial.html#dm_f...)
i am attempting to compile.

ODBC is not topical here since it is not standard C. There are, however,
mailing lists for unixODBC, see the unixODBC web site for details. For
the MS implementation there are plenty of Microsoft groups.

How can i fix these linking errors?

How to drive your tools to link to non-standard libraries is also not
topical here. However, there are Cygwin mailing lists. However I suggest
you try specifying the libraries you need after the object files that
reference them.
 
J

John Bode

I am trying to compile a simple ODBC and C example on Windows XP SP2.
I have Cygwin_NT 5.1.

Note that questions about ODBC, cygwin, XP, etc. really aren't topical
here (your question isn't about the C language as such, which is what
this group focuses on). In the future, you should direct such
questions to newsgroups devoted to embedded SQL or ODBC programming.
However, I think I know the answer to your problem.

[snip]
Makefile

CC=gcc
INCPATH=-I/usr/include -Iinclude
LIBS=-L. -lodbc32

I suspect you need to add the path to the libodbc32.a library to your
LIBS variable, like so:

-L/cygdrive/c/lib/w32api

Give that a shot, let me know if it works.
 
J

John Bode

I am trying to compile a simple ODBC and C example on Windows XP SP2.
I have Cygwin_NT 5.1.

Note that questions about ODBC on Windows using Cygwin are not topical
for this newsgroup; our focus is on the C language itself, not
applications using C. However, I think I know what your problem is:


[snip]
Makefile

CC=gcc
INCPATH=-I/usr/include -Iinclude
LIBS=-L. -lodbc32

You need to specify the path to the libodbc32.a library, otherwise it
will only look in the standard library path. Add the following to
your LIBS variable:

-L/cygdrive/c/cygwin/lib/w32api

I think that's the right path, anyway.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,813
Latest member
lawrwtwinkle111

Latest Threads

Top