链接静态库时的"未定义引用"

ant*_*009 26 c++ static-libraries

g ++(Ubuntu/Linaro 4.4.4-14ubuntu5)4.4.5

我有以下名为sdpAPI.a的静态库.我在尝试将其与我的测试应用程序链接时遇到问题.只是想知道我是否做错了什么.静态库是用g ++构建的;

我的目录如下:

/projects/unit_test/main.c
/projects/unit_test/sdp/inc/sdpAPH.h
/projects/unit_test/sdp/lib/sdpAPI.a
Run Code Online (Sandbox Code Playgroud)

我的源代码是这样的:

#include <stdio.h>

#include "sdpAPI.h"

int main(void)
{
    printf("----- TEST SDP ------\n");

    try {
        sdpSessionDescription sdp;
        sdp.clear();
    }
    catch(...) {
        printf("----- TEST FAILED --------\n");
        return 0;
    }

    printf("------ TEST SUCCESSFULL ------\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的Makefile是这样的:

OBJECT_FILES = main.o
CC = g++
CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0
TARGET = sdp_demo

INC_PATH = -I sdp/inc
LIB_PATH = -L sdp/lib/sdpAPI.a

$(TARGET): $(OBJECT_FILES)
 $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) $(OBJECT_FILES) -o $(TARGET)

main.o: main.c
 $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) -c main.c

clean:
 rm -f $(TARGET) $(OBJECT_FILES) *~
Run Code Online (Sandbox Code Playgroud)

这些是我得到的链接器错误:

undefined reference to `sdpSessionDescription::sdpSessionDescription()'
undefined reference to `sdpSessionDescription::clear()'
undefined reference to `sdpSessionDescription::~sdpSessionDescription()'
undefined reference to `sdpSessionDescription::~sdpSessionDescription()'
Run Code Online (Sandbox Code Playgroud)

非常感谢任何建议,

pax*_*blo 46

-L指定库路径,而不是特定的库.您可能希望-L sdp/lib -l sdpAPI同时指定路径库名称.

虽然它会尝试前缀和postfix的你的库名lib,要么.a.sl(或类似).

因此,您可能还需要libsdpAPI.a根据gcc联机帮助页重命名库:

-l xyz
     链接器搜索库的标准目录列表,该库实际上是一个名为的文件libxyz.a.


还要记住,命令行中的事物顺序很重要.通过执行$(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) $(OBJECT_FILES) -o $(TARGET)(对象之前的库),在列出库的位置没有未解析的符号,因此不会从该库中引入任何内容.

然后,当您最终引入对象(带有未解析的符号)时,它们将保持未解析状态,因为之后没有列出任何库.

您通常应该在对象之后执行库:

$(CC) $(CFLAGS) $(INC_PATH) $(OBJECT_FILES) $(LIB_PATH) -o $(TARGET)
Run Code Online (Sandbox Code Playgroud)

确保在检查库之前知道所有未解析的符号.

这不会捕获所有问题(例如可以使用其他方法修复的共同依赖库),但它会确保在查看库之前已知对象文件中的所有未解析符号.

从上面引用的手册页的同一部分:

它在您编写此选项的命令中有所不同; 链接器按照指定的顺序搜索和处理库和目标文件.因此,在文件之后但之前foo.o -lz bar.o搜索库.如果引用函数,则可能无法加载这些函数.zfoo.obar.obar.oz

  • 您能否提供指向GCC文档的链接,该文档讨论*“事物的顺序” *非常重要?我知道,根据经验,*顺序*很重要。但是现在我有足够的时间,因此想直接从原始资料中探索这一点。 (2认同)

ice*_*ime 10

  • -L用于指定库路径:

    - Ldir 将目录dir添加到要搜索-l的目录列表中.

  • -l是您需要指定链接的:

    -l library 链接时搜索名为library的库.

你可能需要 -L sdp/lib/ -l sdpAPI