В настоящее время я разрабатываю библиотеку, которая, надеюсь, поможет студентам очень легко визуализировать базовую 2D-графику с помощью C++. Проблема в том, как я это строю. Вот рабочая версия:
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 есть что-то, чего я не понимаю (хотя я потратил много часов на изучение документации). Другие связанные сообщения предполагают, что что-то не так в моей реализации (например, несколько определений функции), но это не так, поскольку я могу отлично запустить приложение.
Все это время смотрел документацию и не видел разницы ... Большое спасибо!
@compor Пожалуйста, подумайте о том, чтобы перевести свой комментарий в ответ, чтобы AlexandruIca могла принять его, чтобы отметить этот вопрос как решенный.
@StanleyF. подойдет, хотя это немного тривиально.





Линия
target_link_libraries(basic_example ${HW_LIB})
должно быть
target_link_libraries(basic_example HW_LIB)
HW_LIB - это имя цели, а ${HW_LIB} - это необъявленная переменная, которая не дает результатов.
Наконец, взгляните на документ для переменные и более сложную тему ссылки на переменные.
target_link_librariesдолжен использоватьHW_LIB, а не${HW_LIB}, это пустая переменная, верно?