c++ 编译
参考连接:
使用CMAKE链接外部的动态库时找不到库文件解决办法:https://blog.csdn.net/yangbing1113/article/details/8036707
CMakeLists.txt的编写
https://blog.csdn.net/zhuquan945/article/details/72847832
1.基础编译命令
a. 命令如下:
gcc main.cpp -I ../include/ -L ../lib -lhello -o demo
b. 说明
-I 指定头文件路径
-L 指定静态库路径
-l 说明链接的库名字
编译成的二进制文件为demo
备注: 对于动态库需要指定动态库路径,命令:export LD_LIBRARY_PATH=./lib
2. cmake命令
以cmake文件来说明各个命令的作用
示例1:
#文件名必须为CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
#PROJECT 定义工程名称
PROJECT (HELLO)
#ADD_SUBDIRECTORY 增加子文件目录进行编译
ADD_SUBDIRECTORY(src)
MESSAGE(STATUS "This is project dir " ${PROJECT_BINARY_DIR})
#SET 定义变量
set(ThirdPartyLibDir ${CMAKE_CURRENT_SOURCE_DIR}/lib)
示例2:
SET(SRC_LIST
main.cpp
../include/hello.h)
# 使用变量SRC_LIST指定的文件编译可执行文件demo
# 与add_executable对应的是add_library,编译库文件
add_executable(demo ${SRC_LIST})
MESSAGE(STATUS "current dir:" ${CMAKE_CURRENT_SOURCE_DIR})
#指定头文件路径
# 如果没有此指令,代码头文件包含需指定头文件路径
# 路径位置指的是当前CmakeList的位置
target_include_directories(demo PRIVATE ../include/)
# 链接动态库
target_link_libraries(demo ${PROJECT_SOURCE_DIR}/lib/libhello.so)
# 链接静态库
#target_link_libraries(demo ${PROJECT_SOURCE_DIR}/lib/libhello.a)
其他命令说明:
add_library( [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] […])
其中表示库文件的名字,该库文件会根据命令里列出的源文件来创建。
而STATIC、SHARED和MODULE的作用是指定生成的库文件的类型。
STATIC库是目标文件的归档文件,在链接其它目标的时候使用。
SHARED库会被动态链接(动态链接库),在运行时会被加载。
MODULE库是一种不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数。
默认状态下,库文件将会在于源文件目录树的构建目录树的位置被创建,该命令也会在这里被调用。
target_link_libraries中属性PRIVATE、PUBLIC、INTERFACE含义
a. 如果源文件(例如CPP)中包含第三方头文件,但是头文件(例如hpp)中不包含该第三方文件头,采用PRIVATE。
b. 如果源文件和头文件中都包含该第三方文件头,采用PUBLIC。
c. 如果头文件中包含该第三方文件头,但是源文件(例如CPP)中不包含,采用 INTERFACE。
编译问题说明:
报错undefined reference可能原因:
动态库没有链接到;
c++链接c文件,未加extern “C”