为什么会出现链接器错误:对…的未定义引用?

问题描述 投票:0回答:1

为什么会出现此错误:undefined reference to `bfopen(char const*, int)'

我创建了一个共享库,其中包括函数bfopen的函数定义。该库的名称为libfiles.so,位于我要从其构建的本地ext/lib目录中。

我正在使用:

g++ -std=c++11 -fPIC -g -Wall -D_DEBUG -I$(PWD)/src -I$(PWD)/ext/include -o parser_tst parser_tst.cc $(PWD)/src/parser.o -L$(PWD)/ext/lib -lpthread -lfftw3f -ldsp -lfiles

我用$(PWD)代替了我的工作目录。我在libfiles.so中查看了nm -D ext/lib/libfiles.so,并能够找到那里列出的函数定义,所以我很茫然。我也没有收到像file does not exist: libfiles.so这样的错误,因此似乎至少是与该文件链接。

这里是我的设置示例:(所有路径都被剪切到其本地路径)

ext / sample / src / test.h:

#ifndef TEST_H
#define TEST_H

int test();

#endif /* TEST_H */

ext / sample / src / test.c:

#include "test.h"

int test() {
    return 0;
}

这是已清理的文件结构:

.
./ext
./ext/Makefile
./ext/sample
./ext/sample/src
./ext/sample/src/Makefile
./ext/sample/src/test.c
./ext/sample/src/test.h
./ext/sample/tst
./ext/sample/tst/Makefile
./ext/sample/Makefile
./ext/sample/ext
./src
./tst
./tst/test_tst.cc
./tst/Makefile
./Makefile

在调用make build之后,它看起来像这样:

.
./ext
./ext/Makefile
./ext/sample
./ext/sample/src
./ext/sample/src/Makefile
./ext/sample/src/test.c
./ext/sample/src/test.h
./ext/sample/src/test.o
./ext/sample/tst
./ext/sample/tst/Makefile
./ext/sample/Makefile
./ext/sample/ext
./ext/sample/include
./ext/sample/include/test.h
./ext/sample/lib
./ext/sample/lib/libtest.so
./ext/lib
./ext/lib/libtest.so
./ext/include
./ext/include/test.h
./src
./tst
./tst/test_tst.cc
./tst/Makefile
./Makefile

最后我调用make test,它会产生输出(包括错误):

make  -i -C ./tst
make[1]: Entering directory `$(PWD)/tst'
make all_tst
make[2]: Entering directory `$(PWD)/tst'
g++ -std=c++11 -fPIC -g -Wall -D_DEBUG -I./src -I$(PWD)/ext/include -o test_tst test_tst.cc -L$(PWD)/ext/lib -ltest
test_tst.cc: In function ‘int main(int, char**)’:
test_tst.cc:4:6: warning: unused variable ‘t’ [-Wunused-variable]
  int t = test();
      ^
/tmp/ccMq869q.o: In function `main':
$(PWD)/tst/test_tst.cc:4: undefined reference to `test()'
collect2: error: ld returned 1 exit status
make[2]: [test_tst] Error 1 (ignored)
make[2]: Leaving directory `$(PWD)/tst'
make[1]: Leaving directory `$(PWD)/tst'

我尝试使用等效于exportsetenv LD_LIBRARY_PATH .)的tcsh,但没有帮助

c++ g++ ld
1个回答
3
投票

一个可能的问题是,您有ext/sample/src/test.c个C文件,它将被编译为C代码。

但是使用库的应用程序是C ++代码

g++ -std=c++11 -fPIC -g -Wall -D_DEBUG -I./src -I$(PWD)/ext/include -o test_tst test_tst.cc -L$(PWD)/ext/lib -ltest

并且包括标头,在这种情况下,标头也从c ++文件编译为C ++代码,但从您的C文件编译为C代码!

因此,您应该在C ++代码中包含以下标头:

extern "C" {
#include "test.h"
}

如何混合使用C和C ++代码:mix C and C++ code

链接器无法从c文件中找到符号的原因是,在C ++中,名称是“脱嵌的”,因为它需要“技巧”来进行函数重载。可以在这里找到更好更详细的解释:name mangling

© www.soinside.com 2019 - 2024. All rights reserved.