C++ 使用makefile与带有OTL的静态库链接时未定义的引用

C++ 使用makefile与带有OTL的静态库链接时未定义的引用,c++,makefile,linker,g++,C++,Makefile,Linker,G++,我想将我的项目链接到一个静态库(msodbcsql11.lib),我想使用一个简单的makefile包含它的头文件(msodbcsql.h)和框架otlv4.h的另一个头文件,但它似乎找不到库。这是我的makefile: CC=g++ LDFLAGS= CFLAGS=-c -Wall SOURCES=main.cpp LIBB = C:\temp\lib LIBINCL = C:\temp\include CFLAGS += -I$(LIBINCL) LDFLAGS += -L$(LIBB) O

我想将我的项目链接到一个静态库(msodbcsql11.lib),我想使用一个简单的makefile包含它的头文件(msodbcsql.h)和框架otlv4.h的另一个头文件,但它似乎找不到库。这是我的makefile:

CC=g++
LDFLAGS=
CFLAGS=-c -Wall
SOURCES=main.cpp
LIBB = C:\temp\lib
LIBINCL = C:\temp\include
CFLAGS += -I$(LIBINCL)
LDFLAGS += -L$(LIBB)
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=main
all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@
我的makefile有什么问题?我该怎么办

编辑:我根据@Jonathan Wakely的答案进行了更新:

LIBB = C:\temp\lib
LIBFILE = msodbcsql11
LDFLAGS += -L$(LIBB) -l$(LIBFILE)
我还是会犯同样的错误

更新:按照@Jonathan Wakely的建议更新了makefile,但仍有错误。顺便说一句,我将libmsodbcsql11.lib的文件格式更改为libmsodbcsql11.a,因为编译器无法检测到.lib版本

CC=g++
LDFLAGS=
CFLAGS=-c -Wall
SOURCES=main.cpp
LIBB = C:\temp\lib
LIBFILE = msodbcsql11
LIBINCL = C:\temp\include
CFLAGS += -I$(LIBINCL)
OBJECTS=$(SOURCES:.cpp=.o)
LDFLAGS += -L$(LIBB) -l$(LIBFILE)
EXECUTABLE=main

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(OBJECTS) $(LDFLAGS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@
CC=g++
LDFLAGS=
CFLAGS=-c-墙
SOURCES=main.cpp
LIBB=C:\temp\lib
LIBFILE=msodbcsql11
LIBINCL=C:\temp\include
CFLAGS+=-I$(LIBINCL)
对象=$(源:.cpp=.o)
LDFLAGS+=-L$(LIBB)-L$(LIBFILE)
可执行文件=main
全部:$(源)$(可执行)
$(可执行文件):$(对象)
$(CC)$(对象)$(LDFLAGS)-o$@
.cpp.o:
$(CC)$(CFLAGS)$<-o$@

标记
-L
只告诉链接器在哪里查找库,您需要使用
-L
告诉链接器要链接到哪个库。

标记
-L
只告诉链接器在哪里查找库,您需要使用
-l
来告诉它链接到哪个库。

-l
标志只告诉链接器在哪里查找库,您需要使用
-l
来告诉它链接到哪个库。

-l
标志只告诉链接器在哪里查找库,您需要使用
-l
告诉它要链接到哪个库。

这可能会有帮助


显然,需要odbc32.lib文件来调用ODBC函数。这有点令人困惑,因为microsoft ODBC驱动程序有这个msodbcsql11.lib,显然它不是所需要的。尽管我的makefile以前的版本没有调用任何库,所以我接受了@Jonathan Wakely的回答。

这可能会有帮助


显然,需要odbc32.lib文件来调用ODBC函数。这有点令人困惑,因为microsoft ODBC驱动程序有这个msodbcsql11.lib,显然它不是所需要的。尽管我的makefile以前的版本没有调用任何库,所以我接受了@Jonathan Wakely的回答。

这可能会有帮助


显然,需要odbc32.lib文件来调用ODBC函数。这有点令人困惑,因为microsoft ODBC驱动程序有这个msodbcsql11.lib,显然它不是所需要的。尽管我的makefile以前的版本没有调用任何库,所以我接受了@Jonathan Wakely的回答。

这可能会有帮助



显然,需要odbc32.lib文件来调用ODBC函数。这有点令人困惑,因为microsoft ODBC驱动程序有这个msodbcsql11.lib,显然它不是所需要的。不管怎样,我的makefile的早期版本没有调用任何库,所以我接受了@Jonathan Wakely的回答。

您在哪里指定了ODBC层库?那些找不到的函数是通用ODBC函数调用,您需要一个库(类似于Visual C++的
odbc32.lib
)来提供此层。@morbidCode您没有指定要链接到
msodbcsql11.lib
@PaulMcKenzie这不是msodbcsql11.lib吗?很抱歉,我对这个非常陌生是的,但是你在makefile的任何地方都没有提到!链接器应该如何知道你想链接到那个库?长期以来的约定, CX是C编译器,而 CXX/COD>是C++编译器。通过指定CC=g++您打破了许多传统,让您的读者感到困惑。此外,也许更重要的是,您混淆了
使
无效,并使许多隐式规则无效。您在哪里指定了ODBC层库?那些找不到的函数是通用ODBC函数调用,您需要一个库(类似于Visual C++的
odbc32.lib
)来提供此层。@morbidCode您没有指定要链接到
msodbcsql11.lib
@PaulMcKenzie这不是msodbcsql11.lib吗?很抱歉,我对这个非常陌生是的,但是你在makefile的任何地方都没有提到!链接器应该如何知道你想链接到那个库?长期以来的约定, CX是C编译器,而 CXX/COD>是C++编译器。通过指定CC=g++您打破了许多传统,让您的读者感到困惑。此外,也许更重要的是,您混淆了
使
无效,并使许多隐式规则无效。您在哪里指定了ODBC层库?那些找不到的函数是通用ODBC函数调用,您需要一个库(类似于Visual C++的
odbc32.lib
)来提供此层。@morbidCode您没有指定要链接到
msodbcsql11.lib
@PaulMcKenzie这不是msodbcsql11.lib吗?很抱歉,我对这个非常陌生是的,但是你在makefile的任何地方都没有提到!链接器应该如何知道你想链接到那个库?长期以来的约定, CX是C编译器,而 CXX/COD>是C++编译器。通过指定CC=g++您打破了许多传统,让您的读者感到困惑。此外,也许更重要的是,您混淆了
使
无效,并使许多隐式规则无效。您在哪里指定了ODBC层库?那些找不到的函数是通用ODBC函数调用,您需要一个库(类似于Visual C++的
odbc32.lib
)来提供此层。@morbidCode您没有指定要链接到
msodbcsql11.lib
@PaulMcKenzie这不是msodbcsql11.lib吗?很抱歉,我对这个非常陌生是的,但是你在makefile的任何地方都没有提到!链接器如何知道您要链接到该库?根据长期以来的惯例,
CC<
LIBB = C:\temp\lib
LIBFILE = msodbcsql11
LDFLAGS += -L$(LIBB) -l$(LIBFILE)
CC=g++
LDFLAGS=
CFLAGS=-c -Wall
SOURCES=main.cpp
LIBB = C:\temp\lib
LIBFILE = msodbcsql11
LIBINCL = C:\temp\include
CFLAGS += -I$(LIBINCL)
OBJECTS=$(SOURCES:.cpp=.o)
LDFLAGS += -L$(LIBB) -l$(LIBFILE)
EXECUTABLE=main

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(OBJECTS) $(LDFLAGS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@