私はそこにいくつかの関数を持つライブラリを持っています。ほとんどの機能は正常に動作しますが、私は1つのmemset_pattern12
リンクを使用しようとすると失敗します。リンカはライブラリ関数への参照を見つけることができます。私はそこにいると知っています
[ 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
と私は得られたライブラリー内のシンボルを参照することができます:
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
ライブラリは、罰金のビルド
を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)
は私が間違って何をしているのですか?
あなたはライブラリとリンクしていますか? 'CMakeLists.txt'ファイルはどのように見えますか? –
リンカが実際に 'memset_pattern.c.obj'を渡したことを確信していますか? –
CMakeFile.txtで質問を更新しました – Justin808