c++ - 将 Makefile 转换为等效的 CMakeLists.txt
问题描述
我正在做一个项目,我维护一个 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'
Makefile 的 COMMON 变量的一部分。-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
目前,当我使用“make”编译时,我对 CMake 以及我在 CMakeLists.txt 中拥有的知识知之甚少,我得到了许多此类错误:
myproject.cpp:(.text+0xfa9): undefined reference to `glfwSetMouseButtonCallback'
基本上我想将(?)我的代码与 MuJoco 库链接,就像在他们的 Makefile 中所做的那样。
谢谢。
编辑 关于可能的重复标志,我添加了以下标志:
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
解决方案
您还需要将 opengl 库添加到链接库中,target_link_libraries
. 不要用-l
.
推荐阅读
- google-cloud-platform - CORS 中的 Google Cloud Function 多域
- python - 查找单词的所有出现 + 子字符串
- android - AndroidX 测试对话框
- javascript - 从 Meteor.call 在 minimongo 中插入/缓存
- python - 将 python dict 转换为 json
- kubernetes - Rancher 2.0 - 故障排除和修复“控制器管理器不健康问题”
- git - 未能锁定 refs/heads/master 远程裸仓库
- excel - VBA ActiveCell 动态调整大小
- powershell - 解压缩在 PowerShell 中保留两个重复文件
- css - 响应式列表组项目从两列合二为一