我一直在尝试用CMake包含不同类型的库。
我终于让.a
和.dylib
同时使用此代码。
find_library(libname NAMES libcef.dylib PATHS ${libname_PATH})
与此一起,在add_executable
下面初始化构建的所有文件。
target_link_libraries(${PROJECT_NAME} ${libname})
但是,我尝试在.so
文件上使用相同的代码,但它似乎不起作用。
我在尝试构建时从cmake获得此声明。
Target "project name" links to item
-- path of file --
which is a full-path but not a valid library file name.
我不确定这是否是处理.so
文件的正确方法,或者我甚至不完全理解.so
文件是什么。任何意见和/或澄清将非常感激。
编辑:
理论 - 我的理论是因为它在库名称前面没有lib,名为ffmpegsumo.so。但是,当我尝试重命名它时,文件名仍然保存到变量名称中非常奇怪。
答案 0 :(得分:1)
同样适用于.so文件,只需确保所提供的${libname_PATH}
所需的.so文件。
find_library以同样的方式处理所有类型(.a / .so / .dylib / .dll)。问题可能如下
- 路径未正确设置
- 因绝对路径而出错
- 。不存在
- 如果错误来自构建(不是来自仅配置),则.so可能已损坏,请尝试替换它
- 您的图书馆似乎无效
答案 1 :(得分:0)
共享库是动态链接的。这意味着在运行应用程序时,您的操作系统将自动查找并加载.so文件。您只需要告诉cmake库的名称,操作系统将负责其余的工作。
例如,如果要链接到libSDL.so的动态库,只需说:target_link_libraries(${PROJECT_NAME} SDL)
作为完整性检查,您的链接器将确保您的计算机上确实存在SDL库。这就是为什么如果该库在链接时不可用,可能会出现链接错误,即使它实际上是一个动态库。