想要通过CMake引入OpenMesh和Assimp, 但还是折腾了差不多一天, 终于搞掂了, 特此总结一下下~
一般来说, CMake引入第三方库有两种方式, 分别是find_package方式和link_directories方式. 接下来以引入OpenMesh为例进行介绍.
1. find_package方式
这一块坑比较多, 首先自然是find_package找不到FindOpenMesh.cmake. 需要先手动把包含FindOpenMesh.cmake的路径添加到CMAKE_MODULE_PATH中才行, 即
list(APPEND CMAKE_MODULE_PATH "D:\\Library\\OpenMesh\\OpenMesh-7.1\\OpenMesh-7.1\\cmake") find_package(OpenMesh REQUIRED)
此处之所以采用写死OpenMesh路径这样一种不大优雅的方式, 是因为采用$ENV{OPENMESH_DIR}的方式时发现$ENV{OPENMESH_DIR}一直为空, 明明自己已经在环境变量中设置了……
当找到FindOpenMesh.cmake以后又发现FIND_LIBRARY这东西找不到了…… 这时候又得动手改OpenMesh里的FindOpenMesh.cmake文件, 将包含lib的路径添加到SEARCH_PATHS中去, 即
SET (SEARCH_PATHS
/usr/local/
/usr/
"${OPENMESH_LIBRARY_DIR}"
"D:\\Library\\OpenMesh\\OpenMesh-7.1\\OpenMesh-7.1\\build\\Build\\lib"
"D:\\Library\\OpenMesh\\OpenMesh-7.1\\OpenMesh-7.1\\src"
)
难怪师兄吐槽OpenMesh的CMake写得烂…… 还是很有道理的…… 当上述工作完成以后, 就剩链接库的问题啦~ 直接
target_link_libraries(clothsim
CGL ${CGL_LIBRARIES}
nanogui ${NANOGUI_EXTRA_LIBS}
${FREETYPE_LIBRARIES}
${CMAKE_THREADS_INIT}
debug OpenMeshCored
optimized OpenMeshCore
debug OpenMeshToolsd
optimized OpenMeshTools
assimp
)
记得需要用debug和optimized前缀去区分Debug和Release的lib, 而debug/optimized后面跟的一般是lib的名字, 当然也有例外, 等下会说~
2. link_directories方式
可以看出, 上述方式还是有些繁琐的, 而且不大优雅, 因此现在我采用了这种方式. 直接把第三方库放到工程目录下(可以新建个ext等文件夹专门放置第三方库). 只要第三方库容量不大, 这种方式还是很方便的, 毕竟移植性也好, 把工程给别人时别人也不需要再手动改CMakeLists.txt. 当然当第三方库容量较大的时候最好就别用这种方式了, 不然会使得自己的工程显得很臃肿. 直接上四步曲就好了~
#-------------------------------------------------------------------------------
# First and second steps
#-------------------------------------------------------------------------------
# assimp
include_directories(../ext/assimp/include)
link_directories(../ext/assimp/lib)
# OpenMesh
include_directories(../ext/OpenMesh/include)
link_directories(../ext/OpenMesh/lib)
#-------------------------------------------------------------------------------
# Third steps
#-------------------------------------------------------------------------------
add_executable(clothsim ${CLOTHSIM_VIEWER_SOURCE} ${BVH_VIEWER_SOURCE})
#-------------------------------------------------------------------------------
# Fourth steps
#-------------------------------------------------------------------------------
target_link_libraries(clothsim
CGL ${CGL_LIBRARIES}
nanogui ${NANOGUI_EXTRA_LIBS}
${FREETYPE_LIBRARIES}
${CMAKE_THREADS_INIT}
debug OpenMeshCored
optimized OpenMeshCore
debug OpenMeshToolsd
optimized OpenMeshTools
assimp
)
需要注意的是, target_link_libraries中的assimp并未区分Debug和Release的lib, 而且后面跟的”assimp”也并不是所用lib的名字(实际上用的名字是assimp-vc141-mtd和assimp-vc141-mt), 这也是暂时没想通的一点额…… 反正, 先不管噜, 反正导入成功了!
再记录下两个小tips:
a) 添加预定义宏,
add_definitions(-D _USE_MATH_DEFINES)
b) 在VS中添加文件筛选器,
set(BVH_VIEWER_SOURCE
# BVH
BVH/BVHData.cpp
BVH/HBone.cpp
BVH/HMatrix.cpp
BVH/HPoseAdj.cpp
)
source_group("BVH" FILES ${BVH_VIEWER_SOURCE})
add_executable(clothsim ${CLOTHSIM_VIEWER_SOURCE} ${BVH_VIEWER_SOURCE})