对add_library()

时间:2018-08-17 13:46:31

标签: cmake

我目前正在开发一个库,希望该库可以帮助学生使用c ++非常轻松地渲染基本2D图形。问题是我构建它的方式。这是一个工作版本:

cmake_minimum_required( VERSION 2.8 )

project( HWAPI )

set( CMAKE_CXX_STANDARD 11 )

find_package( SDL2 REQUIRED )

include_directories( ${PROJECT_SOURCE_DIR}/include/ )
include_directories( ${SDL2_INCLUDE_DIR} )

set( SRC_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/tests/basic_example.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/include/window.hpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/window.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/include/color.hpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/color.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/include/vec2.hpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/vec2.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/include/hwapi.hpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/hwapi.cpp
    )

add_executable( example ${SRC_FILES} )

target_link_libraries( example ${SDL2_LIBRARIES} )

可执行文件已成功创建,应用程序按预期工作。但是我想将其构建为一个库并将其链接到主程序,以便可以轻松地在代码块(我的学校使用的代码)中创建自定义模板。到目前为止,这是我所做的:

    cmake_minimum_required( VERSION 2.8 )

    project( HWAPI )

    set( CMAKE_CXX_STANDARD 11 )

    find_package( SDL2 REQUIRED )

    include_directories( ${PROJECT_SOURCE_DIR}/include/ )
    include_directories( ${SDL2_INCLUDE_DIR} )

    set( SRC_FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/include/window.hpp
        ${CMAKE_CURRENT_SOURCE_DIR}/src/window.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/include/color.hpp
        ${CMAKE_CURRENT_SOURCE_DIR}/src/color.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/include/vec2.hpp
        ${CMAKE_CURRENT_SOURCE_DIR}/src/vec2.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/include/hwapi.hpp
        ${CMAKE_CURRENT_SOURCE_DIR}/src/hwapi.cpp
        )

    add_library( HW_LIB ${SRC_FILES} )

    target_link_libraries( HW_LIB ${SDL2_LIBRARIES} )

    add_executable( basic_example 
           ${CMAKE_CURRENT_SOURCE_DIR}/tests/basic_example.cpp 
                  )
    target_link_libraries( basic_example ${HW_LIB} )

运行make会出现以下错误:

CMakeFiles/basic_example.dir/tests/basic_example.cpp.o: In function `main':
basic_example.cpp:(.text+0x55): undefined reference to `hw::color::color(unsigned char, unsigned char, unsigned char, unsigned char)'
basic_example.cpp:(.text+0x6b): undefined reference to `dummy_api::point(int, int, hw::color const&)'
basic_example.cpp:(.text+0x8c): undefined reference to `hw::color::color(unsigned char, unsigned char, unsigned char, unsigned char)'
basic_example.cpp:(.text+0xac): undefined reference to `dummy_api::line(int, int, int, int, hw::color const&)'
basic_example.cpp:(.text+0xcd): undefined reference to `hw::color::color(unsigned char, unsigned char, unsigned char, unsigned char)'
basic_example.cpp:(.text+0xfb): undefined reference to `dummy_api::outline_triangle(int, int, int, int, int, int, hw::color const&)'
basic_example.cpp:(.text+0x13b): undefined reference to `dummy_api::rectangle(int, int, int, int, hw::color const&)'
basic_example.cpp:(.text+0x177): undefined reference to `dummy_api::outline_rectangle(int, int, int, int, hw::color const&)'
basic_example.cpp:(.text+0x1b5): undefined reference to `dummy_api::draw(std::function<void ()>, std::function<void ()>)'
collect2: error: ld returned 1 exit status
make[2]: *** [basic_example] Error 1
make[1]: *** [CMakeFiles/basic_example.dir/all] Error 2
make: *** [all] Error 2

我要运行的示例仅调用了库提供的一些函数,仅此而已。为什么我不能按预期创建库?我敢肯定,关于add_library的某些内容我不了解(即使我花了很多时间来查看文档)。其他相关文章表明我的实现存在问题(例如,一个函数的多个定义),但事实并非如此,因为我可以完美地运行该应用程序。

1 个答案:

答案 0 :(得分:1)

target_link_libraries(basic_example ${HW_LIB})

应该是

target_link_libraries(basic_example HW_LIB)

HW_LIB是目标的名称,使用${HW_LIB}是未声明的变量,导致没有任何结果。

最后,请查看variables的文档以及variable references的更高级主题。