我正在开发一个项目,如果我维护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 .)
因此,我试图定义类似于Makefile中的mujocoCommon
的变量COMMON
以及随后在CMake的Mujoco_INCLUDE_DIRS
中使用的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
目前,我对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
答案 0 :(得分:0)
您还需要将opengl库添加到链接库target_link_libraries
中。不要使用-l
添加它们。