假设我有A、B和C三个包。包B使用了包A,包C又使用了包B。我创建了共享库。
因此,在包B中,我做了如下操作:
只要A被安装在C的link_directories之外的位置,就可以正确处理此问题。我想知道正确的处理方式是什么。对我来说,在C中使用
因此,在包B中,我做了如下操作:
find_package(A)
...
if(${A_FOUND})
target_link_libraries(B ${A_LIBRARIES})
endif()
在 C 包中,我执行以下操作:
find_package(B)
...
if(${B_FOUND})
target_link_libraries(C ${B_LIBRARIES})
endif()
add_executable(main main.cpp)
target_link_libraries(main C)
其中 ${B_LIBRARIES} 只包含 B。编译器将会报错。
/usr/bin/ld: cannot find -lA
collect2: error: ld returned 1 exit status
只要A被安装在C的link_directories之外的位置,就可以正确处理此问题。我想知道正确的处理方式是什么。对我来说,在C中使用
find_package(A)
(这将起作用)似乎不太好。尤其是对我来说,因为我事先不知道B是否依赖于A。它也可能依赖于其他软件包。
find_package(A)
会定义一个名为A_LIBRARIES
的变量,用于将可执行文件/库与 A 进行链接:target_link_libraries(B ${A_LIBRARIES})
。有关FindA.cmake
脚本的详细信息,请参见说明。 - Tsyvarev${A_LIBRARIES}
只包含A
。如果不清楚,对不起。但是,仍然存在相同的问题,因为${B_LIBRARIES}
不包含A
。至少我从未见过任何将其所有依赖项包括在${A_LIBRARIES}
和${A_INCLUDE_DIRECTORIES}
等中的项目。我应该无论如何这样做吗? - Sbte${A_LIBRARIES}
应该包含库 A 的绝对路径,这样链接器即使没有设置link_directories
也能找到它。同样地,${B_LIBRARIES}
应该包含A
和B
的绝对路径。 - Tsyvarev${A_LIBRARIES}
放入${B_LIBRARIES}
中?我从未见过任何这样做的项目。您有这样做的示例吗?对我来说,这似乎不可能是“正确”的方法。如果${B_LIBRARIES}
仅包含B部分的库,那么这对我更有意义。 - Sbte