cmakelist会去系统默认的路径加载头文件和库文件,头文件:/usr/include/,/usr/local/include,库文件:/usr/lib,/usr/local/lib。
如果想要在其他路径,添加需要提前指定。
1.头文件
include_directories(
./include/webrtc
)
这里是添加相对CMakeList.txt同级目录的include下的webrtc路径。相对路径是以CMakeList.txt为参考的,因为cmake处理的是CMakeList.txt文件。
然后在.h文件里即可添加。
2.库文件
2.1.先添加库目录
link_directories(${CMAKE_SOURCE_DIR}/thirdparty/lib/ ${CMAKE_SOURCE_DIR}/lib/)
在这里添加的路径其优先级是高于/usr/下的系统路径的
其中CMAKE_SOURCE_DIR变量是指CMakeList.txt所在的目录。CMake 2.8.0 以下的版本,加载动态链接库可以使用相对路径,但2.8.0以上需要使用绝对路径。
2.2.再添加库
如果已经添加了库路径,这里这还是加载不到,可能因为没有软链接关系,并不能够直接添加一个动态库,而是要给它设置软链接。
target_link_libraries(
${PROJECT_NAME}
libwebrtc.a
# webrtc #另一种写法
libshm.so
# shm #另一种写法
)
在cmakelist.txt的语法中,libgio-2.0.so.0.7200.4,就是gio-2.0,因为它会把lib和.so之间作为有效库名称。但加入路径后就不会这样判定了,因此如果想添加libgio-2.0.so.0.7200.4,可以写成 ${CMAKE_SOURCE_DIR}/lib/libgio-2.0.so.0.7200.4
。
3.批量添加库
file(GLOB_RECURSE ffmpeg_LIB "thirdPart/ffmpeg/lib/*.so")
target_link_libraries(${PROJECT_NAME}
{
${ffmpeg_LIB}
}
4.添加cpp文件
file(GLOB_RECURSE SOURCES "./*.cpp") #当前目录及其子目录的所有.cpp文件,并将它添加到SOURCES中
file(GLOB SOURCES_VIDEO "video/*.cpp") #video目录下的.cpp文件,不递归其子目录
add_executable(${PROJECT_NAME}
D_main.cpp
${SOURCES}
# ${SOURCES_VIDEO}
)
#file(GLOB_RECURSE SOURCES "*.cpp" "*.cxx") 添加多个
但是这样会存在一个问题,比如在当前文件夹里创建build,也会遍历生成在这个文件夹里的文件,这时可能会出对象重复定义的问题,比如main函数重复定义。
因此要除去build函数的路径。
list(FILTER SOURCES EXCLUDE REGEX "/build/.*") #排除SOURCES变量中/build/目录下的文件
#查找当前目录下的所有源文件
#并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
add_executable(Demo ${DIR_SRCS})
增加子目录的cmakelists.txt编译
//这样它就会去xrtc去寻找cmakelists.txt文件,并且执行它
add_subdirectory("./xrtc")
增加日志
message(STATUS "==========")
cmake
Command ‘cmake’ not found, but can be installed with:
sudo snap install cmake # version 3.30.1, or
sudo apt install cmake # version 3.22.1-1ubuntu1.22.04.2
See ‘snap info cmake’ for additional versions.
cmake安装
https://cmake.org/download/
./bootstrap
make -j10
sudo make install
make VERBOSE=1 //编译时打印更详细信息