我目前正在开发一个库,希望该库可以帮助学生使用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的某些内容我不了解(即使我花了很多时间来查看文档)。其他相关文章表明我的实现存在问题(例如,一个函数的多个定义),但事实并非如此,因为我可以完美地运行该应用程序。
答案 0 :(得分:1)
行
target_link_libraries(basic_example ${HW_LIB})
应该是
target_link_libraries(basic_example HW_LIB)
HW_LIB
是目标的名称,使用${HW_LIB}
是未声明的变量,导致没有任何结果。
最后,请查看variables的文档以及variable references的更高级主题。