【问题标题】:undefined references when linking with static library with OTL using a makefile使用 makefile 与带有 OTL 的静态库链接时未定义的引用
【发布时间】:2015-03-06 10:53:55
【问题描述】:

我想将我的项目链接到一个静态库 (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 $@

这是我的 C++ 代码:

#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 时的构建:

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

【问题讨论】:

  • 您在哪里指定了 ODBC 层库?那些找不到的函数是通用的 ODBC 函数调用,你需要一个库(类似于 Visual C++ 的odbc32.lib)来提供这个层。
  • @morbidCode 您没有指定要与 msodbcsql11.lib 链接的任何位置。
  • @PaulMcKenzie 不是 msodbcsql11.lib 吗?抱歉,我对此非常陌生
  • 是的,但是您在 makefile 中的任何地方都没有提到这一点!链接器应该如何知道您要链接到该库?
  • 按照长期惯例,CC 是 C 编译器,而 CXX 是 C++ 编译器。通过指定 CC=g++,您打破了许多传统并使您的读者感到困惑。此外,也许更重要的是,您混淆了make,并使许多隐含规则变得无用。

标签: c++ makefile linker g++


【解决方案1】:

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

【讨论】:

  • 好的,我改成这个:我为库创建了变量 LIBFILE。 LIBB = C:\temp\lib LIBFILE = msodbcsql11 LDFLAGS += -L$(LIBB) -l$(LIBFILE),我仍然遇到同样的错误。
  • 喜欢这个? $(EXECUTABLE): $(OBJECTS) $(CC) $(OBJECTS) $(LDFLAGS) -o $@ 是链接器命令吗?
  • 是的,$(CC) $(OBJECTS) $(LDFLAGS) -o $@ 部分。
  • 还是一样。我将发布完整更新的makefile。也许还有另一个问题。
  • 我当前的 makefile 没有任何问题!我使用了错误的库,谢谢。
【解决方案2】:

这可能会有所帮助...

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

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多