LINK_DIRECTORIES和rpath-link的区别

CMakeList.txt中,LINK_DIRECTORIES和rpath-link都是用来指定链接库路径的,但是有区别,看来具体例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置库路径
LINK_DIRECTORIES(
${PROJECT_ROOT_DIR}/libs/kTrade/libs
${PROJECT_ROOT_DIR}/libs/kTrade/libs/ama_3_9_8 # (1)
)

# ...省略若干...

TARGET_LINK_LIBRARIES(AmaMD
dl Engine rt pthread
kTradeUtils
amaquote g3log
ama
-Wunused-function
-Wl,-rpath,'$ORIGIN'/libs/Ama,-rpath,'$ORIGIN'/libs,-rpath-link,${PROJECT_ROOT_DIR}/libs/kTrade/libs/ama_3_9_8 # (2)
)

在注释(1)处的目录下面有libama.so库和其依赖的若干.so
如果只加注释(1)处的路径而不加注释(2)处的-rpath-link参数,则会报错找不到通过ama间接依赖的一系列.so的问题,
如果只加注释(2)处的-rpath-link参数而不加注释(1)处的路径,则会报错找不到ama库本身的问题。

解决方案是要么两处都加上,要么只加(1)处的路径,但是需要在TARGET_LINK_LIBRARIES中写出所有通过ama间接依赖到的库名字,这样就都会通过(1)处的路径找到它们并使它们参与到链接中。
总之,直接链接的库只会通过(1)处指定的路径查找,而间接链接到的库只会通过(2)处指定的路径进行查找。