- fPIC
add_compile_options(-fPIC)
大概意思是缺少 -fPIC 这个编译参数
https://cxyzjd.com/article/winafa/114847300
- -fuse-ld=gold
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
-fuse-ld = gold标志指示应使用黄金链接器。
gold是Google的链接器:
https://en.wikipedia.org/wiki/Gold_(linker) 关于c++ - '-fuse-ld=gold’标志的目标是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49954519/ The -fuse-ld=gold flag indicates that the gold Linker should be used. gold is a Linker from Google:
https://en.wikipedia.org/wiki/Gold_(linker)
- add_subdirectory
add_subdirectory(thirdparty/opencv)
https://www.jianshu.com/p/07acea4e86a3
add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])
添加一个子目录并构建该子目录。
- CMAKE_CXX_FLAGS 相关参数
CMAKE_CXX_FLAGS
- CMake 中用到的PUBLIC,PRIVATE,INTERFACE之间的区别。
这里我用一个比喻,最外层要调用的文件是hello-word.cpp,以cpp结尾的是男的,以.h结尾的是女的。子文件下的文件就是孩子,其中.cpp是儿子,.h结尾的是儿媳。.so 就是伴读书童。CMakeLists.txt就是家规。 - PRIVATE
target_include_directories(${TARGET} PRIVATE
${generate_mfr_INCLUDE_DIRS}
${MFR_CPP_STRUCT_CONVERT_INCLUDE_DIR})
PRIVATE:私有的。生成 libhello-world.so时,只在 hello_world.c 中包含了 hello.h,libhello-world.so 对外的头文件——hello_world.h 中不包含 hello.h。而且 main.c 不会调用 hello.c 中的函数,或者说 main.c 不知道 hello.c 的存在,那么在 hello-world/CMakeLists.txt 中应该写入:
target_link_libraries(hello-world PRIVATE hello)
target_include_directories(hello-world PRIVATE hello)
通俗的讲,就是自己的直接调用的兄弟用到了小弟,自己却不知道小弟的存在,就在PRIVATE中加入小弟的名字,表示他的存在
- INTERFACE
target_link_libraries(${PROJECT_NAME} INTERFACE pointcloud_mask)