c - 链接器找不到对我知道的库函数的引用

标签 c linker

我有一个库,里面有一些函数。大多数功能都可以正常工作,但是当我尝试使用一个 memset_pattern12 时,链接失败了:

CMakeFiles/kernel.dir/src/framebuffer.c.obj: In function `framebufferClearScreen':
/Users/user/Development/test/src/framebuffer.c:123: undefined reference to `memset_pattern12'
collect2: error: ld returned 1 exit status

库构建良好:

[  5%] Building C object CMakeFiles/myLibc.dir/src/libs/libc/malloc.c.obj
[ 11%] Building C object CMakeFiles/myLibc.dir/src/libs/libc/memcmp.c.obj
[ 17%] Building C object CMakeFiles/myLibc.dir/src/libs/libc/memcpy.c.obj
[ 23%] Building C object CMakeFiles/myLibc.dir/src/libs/libc/memset.c.obj
[ 29%] Building C object CMakeFiles/myLibc.dir/src/libs/libc/memset_pattern.c.obj
[ 35%] Building C object CMakeFiles/myLibc.dir/src/libs/libc/sbrk.c.obj
[ 41%] Linking C static library libmyLibc.a

我可以在生成的库中看到符号:

nm compile/libmyLibc.a 

malloc.c.obj:
00000000 B heap_base

memcmp.c.obj:
00000000 T memcmp

memcpy.c.obj:
00000000 T memcpy

memset.c.obj:
00000000 T memset

memset_pattern.c.obj:
         U memcpy
00000000 T memset_pattern12

sbrk.c.obj:
         U _GLOBAL_OFFSET_TABLE_
         U __end
         U _get_stack_pointer
00000000 b heap_end.3627
00000000 T sbrk

memset_pattern12 没有什么特别之处:

memset_pattern12(void *buf, const void *pattern12, size_t len) {
    char *start = (char *)buf;
    char *bufPointer= (char *)buf;
    while ((start + len) - bufPointer >= 12) {
        memcpy(bufPointer, pattern12, 12);
        bufPointer+= 12;
    }
    if ((start + len) - bufPointer != 0) {
        memcpy(bufPointer, pattern12, (start + len) - bufPointer);
    }
}

我的 CMakeList.txt:

set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostartfiles" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffreestanding" )

set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${PROJECT_SOURCE_DIR}/etc/linker.ld" )

add_library(myLibc STATIC
  src/libs/libc/malloc.c
  src/libs/libc/memcmp.c
  src/libs/libc/memcpy.c
  src/libs/libc/memset.c
  src/libs/libc/memset_pattern.c
  src/libs/libc/sbrk.c
)

add_executable(kernel
  src/arch/arm/start.S
  src/cstartup.c
  src/kernel.c
  src/framebuffer.c
  src/platform/rpi/platform.c
  src/platform/rpi/rpi-irq.c
  src/platform/rpi/rpi-fiq.c
  src/platform/rpi/rpi-mailbox.c
  src/platform/rpi/rpi-watchdog.c
)

add_dependencies(kernel myLibc)

target_link_libraries(kernel)

我做错了什么?

最佳答案

target_link_libraries(kernel)

您实际上并没有告诉 CMake 链接任何东西。您需要在此处添加库:

target_link_libraries(kernel myLibc)

如果您这样做,依赖关系将自动设置,因此您不需要 add_dependencies 命令。

关于c - 链接器找不到对我知道的库函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44476993/

相关文章:

visual-c++ - Visual C++ - 无法看到缺少哪个外部

xcode - 使用 swift 为 Xcode 项目自定义链接器

c - 存储指针值

java - 什么是\xHEX 字符?是否有它们的表格?

c - 优化用于模式填充数组的嵌套循环,以帮助编译器生成高效的 ARM 程序集?

macos - Mac OS X 上的 gcc : how to link libraries installed with MacPorts?

Android NDK CMake 链接问题

根据用户输入构造二维数组的正确方法

c - Matlab高效代码生成

Linux 上的 C++ 开发 - 我从哪里开始?