首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用makefile与带有OTL的静态库链接时未定义的引用

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

Stack Overflow用户
提问于 2015-03-06 10:53:55
回答 2查看 2.2K关注 0票数 0

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

代码语言:javascript
复制
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 $@

这是我的c++代码:

代码语言:javascript
复制
#include <iostream>
#define OTL_ODBC_MSSQL_2008 // Compile OTL 4/ODBC, MS SQL 2008
#include <otlv4.h>

int main(){
    otl_connect db; //undefined reference errors
}

下面是我声明otl_connect时的构建:

代码语言:javascript
复制
18:42:33 **** Incremental Build of configuration Default for project mak ****
make all 
g++ -c -Wall -IC:\temp\include main.cpp -o main.o
g++  -LC:\temp\lib main.o -o main
main.o:main.cpp:(.text$_ZN8otl_connD1Ev[_ZN8otl_connD1Ev]+0x66): undefined reference to `SQLFreeHandle'
main.o:main.cpp:(.text$_ZN8otl_connD1Ev[_ZN8otl_connD1Ev]+0x66): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SQLFreeHandle'
main.o:main.cpp:(.text$_ZN8otl_connD1Ev[_ZN8otl_connD1Ev]+0x9e): undefined reference to `SQLFreeHandle'
main.o:main.cpp:(.text$_ZN8otl_connD1Ev[_ZN8otl_connD1Ev]+0x9e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SQLFreeHandle'
main.o:main.cpp:(.text$_ZN8otl_conn6logoffEv[_ZN8otl_conn6logoffEv]+0x54): undefined reference to `SQLDisconnect'
main.o:main.cpp:(.text$_ZN8otl_conn6logoffEv[_ZN8otl_conn6logoffEv]+0x54): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SQLDisconnect'
main.o:main.cpp:(.text$_ZN8otl_conn5errorER7otl_exc[_ZN8otl_conn5errorER7otl_exc]+0x70): undefined reference to `SQLGetDiagRec'
main.o:main.cpp:(.text$_ZN8otl_conn5errorER7otl_exc[_ZN8otl_conn5errorER7otl_exc]+0x70): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SQLGetDiagRec'
main.o:main.cpp:(.text$_ZN8otl_conn6commitEv[_ZN8otl_conn6commitEv]+0x23): undefined reference to `SQLEndTran'
main.o:main.cpp:(.text$_ZN8otl_conn6commitEv[_ZN8otl_conn6commitEv]+0x23): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SQLEndTran'
collect2: error: ld returned 1 exit status
makefile:14: recipe for target 'main' failed
make: *** [main] Error 1

18:42:35 Build Finished (took 1s.993ms)

我的makefile怎么了?我该怎么办?

编辑:我是根据@Jonathan的回答更新的:

代码语言:javascript
复制
LIBB = C:\temp\lib
LIBFILE = msodbcsql11
LDFLAGS += -L$(LIBB) -l$(LIBFILE)

我还是会犯同样的错误

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

代码语言:javascript
复制
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 $@
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-06 11:01:14

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-07 04:55:17

这可能会有帮助..。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28897264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档