c++代码中对c函数的未定义引用
undefined reference to c functions in c++ code
我有一个奇怪的问题:下面的代码编译得很好
src.cpp:
extern "C" {
#include "header.h"
}
void A::Execute() {
B::Instance().Reset(ix);
c_func(ix);// this is c functions declared in header.h
C::Instance().Erase(ix);
}
但是当我注释掉c_funk()时,在所有使用header.h文件中c函数的地方都会出现链接错误。
有了这个小小的改变:
void A::Execute() {
B::Instance().Reset(ix);
//c_func(ix);// this is c function declared in header.h
C::Instance().Erase(ix);
}
我得到:对c_func()的未定义引用
有什么解决办法吗?谢谢
更新:
我在header.h:foo_for_linkage_problem()中添加了一个伪函数
并以这种方式解决了问题。据我所知,链接器试图进行一些优化来解决这个问题。新代码:
void A::Execute() {
B::Instance().Reset(ix);
foo_for_linkage_problem();// this is c empty function declared in header.h
C::Instance().Erase(ix);
}
tldnr:您在向链接器提供库的顺序上有问题。
我想我知道出了什么问题。假设您有四个文件:
main.c
:
#include <stdio.h>
int a();
int b();
int main()
{
printf("%dn", a());
printf("%dn", b());
return 0;
}
main2.c
:
#include <stdio.h>
int a();
int b();
int main()
{
//printf("%dn", a());
printf("%dn", b());
return 0;
}
a.c
:
int a()
{
return 67;
}
b.c
:
int a();
int b()
{
return a()+5;
}
我们创建liba.a
和libb.a
:
gcc a.c -c -o a.o
gcc b.c -c -o b.o
ar rcs liba.a a.o
ar rcs libb.a b.o
现在我们编译我们的exec:
gcc main.c liba.a libb.a -o test
一切都很好
gcc main2.c liba.a libb.a -o test
我得到:
libb.a(b.o): In function `b':
b.c:(.text+0xa): undefined reference to `a'
collect2: error: ld returned 1 exit status
让我们检查一下我的库提供/需要哪些符号:
$nm liba.a
a.o:
0000000000000000 T a
符号类型T
意味着该库具有提供符号a
的文件a.o
$nm libb.a
b.o:
U a
0000000000000000 T b
libb.a
包含提供符号b
但需要符号a
的文件b.o
当被要求时,链接器不包括整个静态库。它会查找需要哪些.o
文件,并仅链接这些文件。因此,您提供文件的顺序至关重要。
当执行以下命令时,将编译main.c
,并且它需要a
和b
符号。当链接器获得liba.a
库时,它链接a.o
文件,因为它提供了a
符号。当链接器获得libb.a
库时,它链接b.o
文件,因为它提供了b
符号。一切都很好。
gcc main.c liba.a libb.a -o test
当执行main2命令时,main2.c
被编译,并且它只需要b
符号。当链接器得到liba.a
时,它不链接a.o
,因为根本不需要a
。然后链接器得到libb.a
库,它链接b.o
文件,因为它提供了b
符号。但是b.o
文件需要符号a
,并且链接a.o
为时已晚,liba.a
已经被处理。请注意,当我切换库,它将干净地编译:
gcc main2.c libb.a liba.a -o test
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用