我有一个库,里面有一些函数。大多数功能都可以正常工作,但是当我尝试使用一个 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/