Как я могу решить неопределенные ошибки ссылок с помощью Conan и SDL2 в Ubuntu 16.10?

Я пытаюсь заставить Конана работать в тестовом проекте, следуя их руководству по началу работы, чтобы я мог начать использовать его в реальном проекте. Я пытаюсь использовать SDL2 с glew в проекте C++, скомпилированном с g++ в Ubuntu 16.10 x64.

Мой conanfile.txt выглядит так:

[requires]
SDL2/2.0.5@lasote/stable
glew/2.0.0@coding3d/stable

[generators]
cmake

Мой файл CMakeLists.txt выглядит так:

project(conantest)

cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_STANDARD 11)

include(conan/conanbuildinfo.cmake)
conan_basic_setup()

set(SRC_FILES main.cpp Display.cpp)
add_executable(conantest ${SRC_FILES})

Мой проект состоит из каталога, содержащего CMakeLists.txt, conanfile.txt, всего моего исходного кода, каталога сборки для Cmake, каталога conan для Conan и файла rebuild.sh. Я использую этот сценарий rebuild.sh для очистки и сборки проекта всякий раз, когда я изменяю среду сборки (rm -r, хотя и неоптимальный, когда он работает, гарантирует, что все ошибки из предыдущей установки будут удалены после того, как я попытаюсь исправить).

Мой rebuild.sh выглядит так:

rm -r ./build/*
rm -r ./conan/*
cd conan
conan install ..
cd ../build
cmake ..
make

Когда я запускаю этот скрипт, кажется, что все работает, пока не будет связан конечный исполняемый файл. Когда это происходит, я получаю Display.cpp:(.text+0x8a): undefined reference to `SDL_Init', Чтобы решить эту проблему, я попробовал решения здесь и здесь. Хотя они не относятся к SDL, я не смог найти какие-либо ресурсы, которые есть.

Вот zip-файл полной среды, которую я использую, включая MCVE.

1 ответ

Решение

Вы должны сказать CMake, чтобы связываться с библиотеками самостоятельно, так как conanbuildinfo.cmake не может знать название вашей цели.

Просто добавив эту строку в нижней части вашего CMakeLists.txt файл будет работать:

conan_target_link_libraries(conantest)

Эта команда вызовет target_link_libraries для всех зависимостей, указанных в conanfile.

Вот еще один CMakeLists.txt Например, если вы хотите использовать более "современный" подход CMake, который больше фокусируется на целях, а не на глобальных настройках:

cmake_minimum_required(VERSION 3.5)
project(conantest)

include(conan/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)

add_executable(conantest main.cpp Display.cpp)
set_property(TARGET conantest PROPERTY CXX_STANDARD 11)
target_link_libraries(conantest CONAN_PKG::SDL2 CONAN_PKG::glew)
Другие вопросы по тегам