2017-06-10 2 views
2

私はそこにいくつかの関数を持つライブラリを持っています。ほとんどの機能は正常に動作しますが、私は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) 

は私が間違って何をしているのですか?

+0

あなたはライブラリとリンクしていますか? 'CMakeLists.txt'ファイルはどのように見えますか? –

+0

リンカが実際に 'memset_pattern.c.obj'を渡したことを確信していますか? –

+0

CMakeFile.txtで質問を更新しました – Justin808

答えて

1

target_link_libraries(kernel) 

を使用すると、実際には何とリンクするCMakeのを教えていません。あなたはここにライブラリを追加する必要があります。

target_link_libraries(kernel myLibc) 

あなたがこれを行う場合は、add_dependenciesコマンドを必要としないので、依存関係が自動的に設定されます。

+0

私はばかです...しかし、それはどうやって 'memcmp'にリンクしていますか? 'memset_pattern'を使ってコードを削除するとコンパイルされてうまく動作します。 – Justin808

+0

C標準ライブラリmemcmpがあります、それは呼び出されていますか? –

+0

@ Justin808標準のCライブラリにリンクしないようにリンカに指示しません。 –

関連する問題