Преобразование Makefile в эквивалент CMakeLists.txt - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над проектом, в котором я поддерживаю файл CMakeLists.txt, чтобы отслеживать зависимости, когда мне нужно скомпилировать.

Недавно я начал использовать новую библиотеку, которую мне нужно интегрировать в мой проект.Библиотека содержит несколько примеров компиляции, но это чисто Makefile.Я хотел бы интегрировать логику Makefile в файл CMakeLists.txt моего проекта.

Makefile этой библиотеки выглядит следующим образом:

COMMON=-O2 -I/home/john/.mujoco/mjpro200/include -L/home/john/.mujoco/mjpro200/bin -std=c++11 -mavx -pthread -Wl,-rpath,'$$ORIGIN'

all:
    g++ $(COMMON) basic.cpp      -lmujoco200 -lGL -lglew /home/john/.mujoco/mjpro200/bin/libglfw.so.3 -o basic
    gcc -c -O2 -mavx -I/home/john/.mujoco/mjpro200/include /home/john/.mujoco/mjpro200/include/uitools.c
    rm *.o

Я хотел бы преобразовать этот Makefile вCMakeLists.txt точно, если это возможно.Я вижу, что они предоставляют некоторые флаги для потоков (pthread), и я хочу сохранить эти флаги и настройки в моем CMakeLists.txt на тот случай, если они нужны для производительности.

Вот мой CMakeLists.txt:

cmake_minimum_required (VERSION 2.6.0)
project(myproject)
add_compile_options(-std=c++11) # CMake 2.8.12 or newer

if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
  add_definitions("-fno-strict-aliasing -Wall")
endif( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )

# optional in case boost is used
find_package(Boost 1.58 EXACT)
find_package(Eigen REQUIRED)

set(mujocoCommon "-O2 -I/home/john/.mujoco/mjpro200/include -L/home/john/.mujoco/mjpro200/bin -std=c++11 -mavx -pthread -Wl,-rpath,'$$ORIGIN'")

set(Mujoco_INCLUDE_DIRS "/home/john/.mujoco/mjpro200/include")

include_directories(${Boost_INCLUDE_DIRS} ${Eigen_INCLUDE_DIRS} ${Mujoco_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
add_executable(myproject mycode.cpp)
install(TARGETS myproject DESTINATION .)

Итак, я попытался определить переменную mujocoCommon, аналогичную COMMON в Makefile, а также Mujoco_INCLUDE_DIRS, который я затем использую в CMake include_directories.

Обратите внимание, что в myproject.cpp у меня есть код MuJoCo и другие зависимости, на которые мне нужно правильно ссылаться.В Makefile все выглядит немного проще, потому что там код имеет только зависимости MuJoco.

Мне нужно несколько слов о том, как добавить в мой CMakeLists.txt следующее:

  • -mavx -pthread -Wl,-rpath,'$$ORIGIN' часть переменной COMMON файла Makefile.
  • -lmujoco200 -lGL -lglew /home/john/.mujoco/mjpro200/bin/libglfw.so.3
  • -c -O2 -mavx -I/home/john/.mujoco/mjpro200/include /home/john/.mujoco/mjpro200/include/uitools.c

В настоящее время с минимальными знаниями о CMake и о том, что у меня есть вмой CMakeLists.txt, когда я компилирую с использованием «make», я получаю много ошибок:

myproject.cpp:(.text+0xfa9): undefined reference to `glfwSetMouseButtonCallback'

В основном я хотел бы связать (?) мой код с библиотекой MuJoco, как это делается в их Makefile.1039 *

Спасибо.

Редактировать Что касается возможного дублирующего флага, я добавил следующий флаг:

set(Mujoco_LIBRARIES "/home/john/.mujoco/mjpro200/bin")
target_link_libraries(myproject ${Mujoco_LIBRARIES} -lboost_system)

Но это не решилопроблема.

Редактировать 2:

Я также добавил это:

set(CMAKE_CXX_FLAGS "-lmujoco200 -lGL -lglew /home/john/.mujoco/mjpro200/bin/libglfw.so.3")

Ошибки, которые я получаю:

/usr/bin/x86_64-linux-gnu-ld: cannot find -lmujoco200
/usr/bin/x86_64-linux-gnu-ld: cannot find -lglew

1 Ответ

0 голосов
/ 22 октября 2018

Вам также необходимо добавить библиотеки opengl в библиотеки ссылок, target_link_libraries.Не добавляйте их с -l.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...