2017-05-27 7 views
0

CMakeList.txtに2つのライブラリと1つの実行ファイルがあります。私はすべてを実行可能ファイルにリンクしたいと思います。私は一緒にこれらをリンクするとき、私は次のようにエラーの束を取得する瞬間ライブラリをcmakeの実行ファイルにリンクするにはどうしたらいいですか?

cmake_minimum_required(VERSION 2.8) 

# Mark the language as C so that CMake doesn't try to test the C++ 
# cross-compiler's ability to compile a simple program because that will fail 
project(jsos C ASM) 
set(CMAKE_EXECUTABLE_OUTPUT_PATH "./build/") 

# We had to adjust the CMAKE_C_FLAGS variable in the toolchain file to make sure 
# the compiler would work with CMake's simple program compilation test. So unset 
# it explicitly before re-setting it correctly for our system 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostartfiles") 

# Set the linker flags so that we use our "custom" linker script 
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${PROJECT_SOURCE_DIR}/etc/linker.ld") 

add_library(duktape STATIC 
    src/libs/duktape/duktape.c 
) 

add_library(fdlibm STATIC 
    src/libs/fdlibm/e_acos.c 
    src/libs/fdlibm/e_acosh.c 
    src/libs/fdlibm/e_asin.c 
    MORE FILES 
) 

add_executable(kernel 
    src/start.S 
    src/kernel.c 
    src/cstartup.c 
    src/cstubs.c 
    src/rpi-gpio.c 
    src/rpi-interrupts.c 
    src/rpi-armtimer.c 
    src/rpi-systimer.c 
) 

add_dependencies(kernel fdlibm duktape) 

target_link_libraries(kernel fdlibm duktape) 

add_custom_command(
    TARGET kernel POST_BUILD 
    COMMAND ${CMAKE_OBJCOPY} ./kernel${CMAKE_EXECUTABLE_SUFFIX} -O binary ./kernel.img 
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 
    COMMENT "Convert the ELF output file to a binary image" 
) 

[100%] Linking C executable kernel 
libduktape.a(duktape.c.obj): In function `duk_double_trunc_towards_zero': 
src/libs/duktape/duktape.c:12102: undefined reference to `fabs' 
src/libs/duktape/duktape.c:12102: undefined reference to `floor' 

しかしfabsfloorfdlibmです。 duk_double_trunc_towards_zeroduktapeライブラリにありますので、OKとリンクしているようです。私は間違って何をしていますか?あなたの声明の中で

+2

'target_link_libraries'呼び出しでライブラリの順序を入れ替えてみてください。 – arrowd

+0

@arrowdは答えを出して受け入れることができます。これは正しいです – Justin808

答えて

1

target_link_libraries(kernel fdlibm duktape) 

このように(この場合はfdlibm duktape)提供LIBSの順序付きリストから検索されている解決すべき外部refereceシンボル:

  • から始まるが、ライブラリはリンクされています。
  • ライブラリの右側のシンボルを検索します。 (一部はfdlibmである)duktapeの外部シンボルを解決するときに、fdlibmがさえこの検索に使用されていない、あなたの場合は

、及び必要ですが見つからないduktapeシンボル。 duktapeの後にfdlibm を置くだけで、シンボルを見つけることができます。例えば

あなたはduktapeで定義されたいくつかのシンボルに応じて、fdlibmを持っていたし、また他の方法で回避場合、あなたは使用する必要があります。

target_link_libraries(kernel fdlibm duktape fdlibm) 

シンボルは必ず解決されるように。

関連する問題