【问题标题】:Converting a Makefile into CMakeLists.txt equivalent将 Makefile 转换为等效的 CMakeLists.txt
【发布时间】:2018-10-21 22:08:30
【问题描述】:

我正在做一个项目,我维护一个 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,类似于 Makefile 中的 COMMON 以及我随后在 CMake 的 include_directories 中使用的 Mujoco_INCLUDE_DIRS

请注意,在 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

目前,我对 CMake 的了解很少,而且当我使用“make”进行编译时,我的 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

【问题讨论】:

  • 你的 makefile 有 -lgl-lglew 标志。我在您的CMakeLists.txt 中都没有看到它们(以及它们的等价物)。 (建议:将您的任务拆分为将 Makefile 转换为较小的任务。然后谷歌/搜索有关每个小任务的信息。如果您无法解决某些小任务,请在 Stack Overflow 上询问有关此特定任务的信息。)
  • 另见CMake link to external library。我相信它涵盖了使用 Makefile 构建库,然后将其导入项目的情况。
  • 另外,如果您使用 -Wl,-rpath,<path> 设置 RPATH,那么您通常希望在带有 ELF 二进制文件的较新系统上使用 -Wl,--enable-new-dtags

标签: c++ makefile cmake


【解决方案1】:

您还需要将 opengl 库添加到链接库 target_link_libraries。不要使用-l 添加它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多