繁体   English   中英

使用自定义共享库中定义的函数时的链接器错误

Linker error when using a function defined in a custom shared library

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我创建了以下共享库,并希望在另一个c文件中使用该库中定义的功能。

头文件:

#ifndef _MY_MALLOC_H_
#define _MY_MALLOC_H_

#include <dlfcn.h>
#include <stdio.h>
extern void* malloc(size_t sz);

extern void free(void *p);

extern int get_total_malloc_requested(void);


#endif

执行:

#define _GNU_SOURCE

#include "my_malloc.h"

static int num_times_malloc_called = 0;
static int num_times_free_called = 0;

void* malloc(size_t sz)
{
    void *(*libc_malloc)(size_t) = dlsym(RTLD_NEXT, "malloc");
    num_times_malloc_called++;
    fprintf(stderr,"malloc called %d\n",num_times_malloc_called);
    return libc_malloc(sz);
  // return NULL;
}

void free(void *p)
{
    void (*libc_free)(void*) = dlsym(RTLD_NEXT, "free");
    fprintf(stderr,"free\n");
    libc_free(p);
}

int get_total_malloc_requested(void){
  return num_times_malloc_called;
}

创建.so时没有问题。

gcc -shared -fPIC -o my_malloc.so my_malloc.c -ldl

但是,当我从另一个.c文件调用get_total_malloc_requested时,出现链接器错误。

#include <stdio.h>
#include <stdlib.h>


#include "my_malloc.h"

int main(){
   void *ptr;
   ptr = malloc(64); <---no problem here
   fprintf(stderr,"called malloc ");
   free(ptr);<---no problem here
   ptr = malloc(64);
   fprintf(stderr,"called malloc ");
   free(ptr);
   get_total_malloc_requested();<---linker doesn't find the symbol
   return 0;


}

gcc hello.c -o hello.o -L ./my_malloc.c
ld: warning: -L path './my_malloc.c' is not a directory
Undefined symbols for architecture x86_64:
  "_get_total_malloc_requested", referenced from:
      _main in hello-1dfbf1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
1 个回复

您创建了一个共享库,但是没有创建一个可执行文件来使用它。 由于可执行文件未使用它,因此找不到引用的符号。

删除多余的-L选项,并在链接时指定共享对象。

gcc hello.c -o hello ./my_malloc.so
1 创建共享库时,带有静态功能的Qt Linker错误

根据手册,如果您有外部函数,则还必须使用宏进行指定。 如果它是静态内联函数,该怎么办? 具有如下功能: 当我尝试在其他项目中使用它时,出现以下链接错误: 错误11错误LNK2019:无法解析的外部符号“ __declspec(dllimport)公共:静态类QStrin ...

2 在Mac上构建共享库时链接器错误

我正在尝试在Mac上构建一个rust cdylib共享库,其中一些符号仅在最终加载它的主机程序中定义。 我得到一堆关于未解析符号的构建错误,但符号应该在构建时未解析。 如果有任何未解决的符号错误,它应该在宿主程序中的dlopen()时发生。 我的crate使用gcc-7.4或clang ...

3 即使在共享库中定义了函数,链接器错误也未定义引用

我正在尝试使用在两个库中定义的新函数来修改一段 C++ 代码(在 Linux 下使用 gcc 工具链开发),一个共享库(称为 libsio4_api.so)和一个静态库(称为 sio4_main.a) . 原始代码是使用 makefile 构建的,该文件首先创建一个链接到各种目标文件的共享库,然后将 ...

5 调用静态库中定义的全局函数导致链接器错误

我创建了一个简单的静态库项目和一个 Win32 控制台项目来调用函数。 静态库编译没有错误。 但是调用者项目给出了以下错误。 我尝试了一些方法,例如将函数放在 extern "C" 块中,使用 __declspec(dllexport) 导出,但似乎没有任何效果。 有任何想法吗? ...

6 在静态库中使用 OutputIterator 时出现链接器错误

我试图搜索类似的问题,但没有找到可以帮助我解决问题的线程。 如果我错过了,请提前道歉! 我对 C++ 还是很陌生,即使我有使用其他语言(例如 Java)的经验并且我使用的是 Visual Studio Express 2015。所以,我有一个执行一些集合计算的类。 使用输出迭代器的想法来自这个SO ...

7 使用自定义名称空间时的链接器错误

我无法运行一段应该具有自定义名称空间的代码。 我已经在这里和这里查看了解决方案,但是这些解决方案都不适合我的情况。 如果您可以看一下并让我知道我的缺失,我将不胜感激。 我在VS2015中收到MSVCRTD.lib错误和链接器错误(LNK1120)。 我在某处读到这可能是由于我在VS中 ...

2019-11-11 21:20:33 0 48   c++
9 调用标头中定义的模板函数时,C ++链接器错误

调用模板函数时出现链接错误,但是链接器错误似乎没有指向模板函数。 似乎指向函数中的共享指针。 我的类具有模板功能: 大多数类似的问题都说所有实现都放在标头中,这已经完成了。 链接错误发生在调用此函数的类中。 调用黑板的示例类: 错误: Error LNK2019 ...

10 使用cmake在macOS上共享库的链接器问题

我有一个cmake项目,该项目创建一个共享库,该共享库又引用了其他库:openssl,zlib,libevent和libevhtp。 我的项目在Linux上编译/链接良好(它创建共享库,以及链接到我的库的可执行文件(测试用例))。 但是,在macOS上,链接库时会得到未定义的引用: ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM